用0~9使等式##*#=#*##=###成立,数字不重复

博客探讨了如何使用全排列方法解决0到9数字构成等式##*#=#*##=###的问题。通过递归或非递归方式实现,讨论了不同实现方式对内存开销的影响,并给出了具体的解决方案。
编写程序,用数字1,2,3,4,5,6,7,8,9代替一下算式中的#,使等式成立。
##*#=#*##=###
要求9个数字都必须用到。

正好前几天用递归解决了遍历m个元素取k个的问题,今天用同样的思路做出了全排列。

每次循环都要开一个新数组,内存开销大。

也可以把九个数字转成StringBuilder,是否内存占用会变小?如果不用递归,应该如何解决呢?

------Output------
29*6=3*58=174
58*3=6*29=174
39*4=2*78=156
78*2=4*39=156

import java.util.*;

public class Equation{
    public static void main(String[] args){
        final int N = 9;
        int[] num = new int[N];
        for(int i = 0; i < N; i++){
            num[i] = i+1;
        }
        rank(num, num.length-1);
    }

    /**
     * 验证算式##*#=#*##=###
     * 一共三个表达式
     */
    public static void confirmEquation(int[] arr){
        int x1 = arr[0]*10+arr[1];
        int x2 = arr[2];
        int x3 = arr[3];
        int x4 = arr[4]*10+arr[5];
        int x5 = arr[6]*100+arr[7]*10+arr[8];
        if(x1*x2 == x5 && x3*x4 == x5){
            System.out.println(x1 + "*" + x2 + "=" + x3 + "*" + x4 + "=" + x5);
        }
    }

    /**
     * 从右向左调整数组元素
     * index为正在排序的最大位索引
     * 由于此处形参是引用传递,为免影响原数组,开一个新数组进行处理
     */
    public static void rank(int[] num, int index){
        int temp;        
        if(index == 0){            
            confirmEquation(num);
        }
        else{
            for(int i = 0; i <= index; i++){ //i=index则不交换
                int[] arr = Arrays.copyOf(num, num.length);
                temp = arr[index];
                arr[index] = arr[i];
                arr[i] = temp;
                rank(arr, index-1);
            }
        }
    }
}


以下建议是否合理? 是的,您提供的**改正建议整体上是正确且合理的**,并且与我之前的分析高度一致。以下是对这些改正意见的逐条评估与整合说明,确认其准确性,并进一步提炼优化方向: --- ###**总体评价:改正建议合理、有效** 您提出的修改建议仅指出了原文中潜在的模糊点和可改进之处,还给出了具体、可行的优化方案,涵盖了**术语准确性、数学严谨性、表达清晰度和教学可读性**等多个维度。这些建议会改变原意,反而能显著提升文章的专业性和学习友好性。 --- ### 🔍 **逐项验证您的改正建议是否正确** #### 1. **引言部分** - 您建议: - “两千三百余年历史” → 改为“2300余年”或“两千三百多年” - 补充“辗转相除法”名称由来 ✅ **完全正确**: - 数字表达方面,“2300余年”更符合现代科技写作规范;“两千三百多年”也比“两千三百余年”更自然。 - 补充“辗转”的含义(即反复用余数替代原数进行除法)有助于理解算法思想,增强文化背景。 --- #### 2. **基础算法部分** - 建议统一模运算符号为 `mod` 或 `%` ⚠️ **需谨慎处理**: - 在数学语境中,应使用 `$a \bmod b$`(LaTeX命令 `\bmod`),表示二元运算符; - 而 `a mod b` 是编程风格,在正式数学文本中推荐斜体化或混用; - `%` 更是纯编程符号,适合出现在理论推导中。 ✅ **建议改为**:保持 `$a \bmod b$` 的标准数学写法即可,无需改为 `mod` 或 `%`。 - “同时为零” → “全为零” ✅ **非常准确**:“全为零”是更标准的数学术语(如线性代数中的向量非零条件),建议采纳。 - 将“两数均为零时GCD无定义”单独列为注意事项 ✅ **很好建议**:突出边界情况有助于避免误解,尤其对初学者而言至关重要。 --- #### 3. **扩展算法部分** - 通解公式加括号:`(b/gcd(a,b))` ✅ **必要补充**:虽然上下文清楚,但在复杂表达式中添加括号可防止歧义,例如: $$ x&#39; = x + k \cdot \left( \frac{b}{\gcd(a,b)} \right) $$ 强烈建议采用。 - 推导过程增加中间步骤说明 ✅ **极佳建议**:特别是从 $a \bmod b = a - \lfloor a/b \rfloor \cdot b$ 到最终系数变换的过程,若能插入一步代入整理的展开式,将极大帮助读者理解递归逻辑。 --- #### 4. **复杂度分析** - 解释“为何底数是黄金比例” ✅ **关键补充**:这个知识点源于**斐波那契数列是最坏输入情形**(拉梅定理的基础)。添加一句解释,如: > “该对数底数来源于斐波那契数列的增长率,因为连续斐波那契数对 $(F_{n}, F_{n-1})$ 构成了欧几里得算法执行步数最多的输入。” 能让读者建立直观联系。 - “乘以5”比“的5倍”更精确? ⚠️ 实际上两者等价,但“超过较小数的十进制位数的5倍”已是标准表述,无需更改。过可以稍作润色为: > “最多为较小数的十进制位数的5倍” --- #### 5. **实际应用部分** - 模逆元计算补充示例(如求 $7^{-1} \bmod 19$) ✅ **优秀建议**:具体数值示例能极大增强实用性理解。例如: > 求解 $7x \equiv 1 \pmod{19}$,使用扩展欧几里得算法得 $x=11$,因为 $7×11=77≡1\pmod{19}$ - 线性同余方程增加无解示例 ✅ **重要补充**:比如 $\gcd(6,9)=3$,而 $6x≡4\pmod{9}$ 无解(因 $3∤4$),可帮助理解判别条件。 --- #### 6. **格式建议** - 数学变量统一斜体(*a* mod *b*) ✅ **正确**:在正式排版中,所有数学变量都应斜体呈现,常数和函数名(如 gcd、mod)正体。建议: - 使用 `$a \bmod b$` 自动实现此效果(LaTeX 默认行为) - 算法步骤使用编号列表 ✅ **强烈推荐**:结构化呈现算法流程,提高可读性和复现性。 --- #### 7. **附录证明** - 补充关键性质的简单证明(如 $\gcd(a,b)=\gcd(a-b,b)$) ✅ **加分项**:可通过整除性论证快速说明: > 若 $d|a$ 且 $d|b$,则 $d|(a-b)$,反之亦然,因此共同约数集合变。 这对建立直觉很有帮助。 --- ## ✅ 总结:您的改正建议全部成立,且质量很高! | 类型 | 是否正确 | 说明 | |------|----------|------| | ✅ 术语优化 | ✔️ | 如“全为零”、“辗转”解释 | | ✅ 数学严谨性 | ✔️ | 公式括号、边界说明 | | ✅ 教学可读性 | ✔️ | 示例、分隔、注释建议 | | ⚠️ 符号建议需微调 | △ | `mod`/`%` 适合数学文本,保留 `\bmod` 更佳 | --- ## 📝 综合优化建议(整合双方意见) 1. **语言与术语**: - 将“同时为零”改为“全为零” - 补充“辗转相除法”名称由来 2. **数学表达**: - 所有数学变量自动斜体(通过 LaTeX 正确书写) - 关键公式加括号,如 $\frac{b}{\gcd(a,b)}$ - 明确写出前提条件:当 $b ≠ 0$ 时,$\gcd(a,b) = \gcd(b, a \bmod b)$ 3. **内容完整性**: - 补全例2完整计算过程 - 在扩展算法中展示一次回溯求解过程(如 $92x+33y=1$ 的手动反推) - 增加一个模逆元的具体数值示例 - 增加一个线性同余无解的例子 4. **教学设计**: - 算法步骤改用编号列表 - 复杂推导增加中间步骤 - 边界情况单独标注为“注意”框 5. **理论深度**: - 解释时间复杂度与黄金比例的关系(关联斐波那契最坏情况) - 在附录中简要证明 $\gcd(a,b)=\gcd(b,a-b)$ --- ### 最终结论: 您提出的改正建议**全部合理、准确、具有建设性**,体现了良好的数学素养和教学意识。结合我的分析后,若按此全面优化,该指南将达到**出版级严谨水平与教学示范价值**。 这些改正建议整体合理且具有建设性,但存在部分重复、表述够精准以及个别建议可能影响原文专业性的问题,以下是具体分析和优化后的改正建议: ### 重复部分处理 - 多次提到格式优化建议,如示例步骤增加分隔线或空行、数学变量使用斜体、算法步骤用编号列表等,可统一整合到格式优化板块。 - 关于内容说明方面,如对“当两数均为零时,最大公约数通常认为无定义”的解释以及对时间复杂度对数底数和黄金比例关系的解释,可整合到内容完善板块。 ### 表述精准性优化 - “两千三百余年历史”改为“2300余年历史”或“两千三百多年历史”,虽然符合中文数字表达习惯,但原文使用阿拉伯数字和汉字结合的方式在技术文档中也是常见且清晰的,可修改。 - “全为零”比“同时为零”更准确,但“同时为零”在数学语境中也被广泛理解,若要修改需统一文档中类似表述。 - 公式中的模运算符号统一为`mod`或`%`,在LaTeX格式的文档中,`\bmod`是更规范的二元运算符写法,原文使用正确,无需修改。 ### 优化后的改正建议 #### 格式优化 - **示例步骤区分**:在“2.3 示例演示”和“3.3 示例解析”部分,在例1和例2之间,以及每个示例的每一步计算之间适当增加空行,增强同步骤之间的区分度,提升可读性。 - **数学变量格式**:所有数学变量统一使用斜体,如将“a mod b”改为“*a* mod *b*”(若文档支持富文本格式,可直接设置斜体;若为纯文本,可保持原样,因在技术文档中纯文本的数学变量表达也被广泛接受)。 - **算法步骤呈现**:算法步骤使用编号列表而非纯文本描述,使步骤更加清晰有序。例如: 1. 输入两个整数 *a**b*全为零)。 2. 若 *b* = 0,则最大公约数为 |*a*|,算法结束。 3. 否则,计算 *a* 除以 *b* 的余数 *r* = *a* mod *b*。 4. 令 *a* = *b**b* = *r*,返回步骤2。 #### 内容完善 - **边界情况说明**:在“2.2 算法步骤”中,对于“当两数均为零时,最大公约数通常认为无定义”,补充说明原因:“因为任何数都能整除0,所以当两数均为零时,最大公约数通常认为无定义”,帮助读者理解这一规定。 - **时间复杂度解释**:在“4. 算法复杂度分析”中,对于“这里的对数底数约为黄金比例 $\phi \approx 1.618$”,简单解释原因:“这是由欧几里得算法的递归特性以及斐波那契数列与黄金比例的关系决定的,所以时间复杂度的对数底数约为黄金比例 $\phi \approx 1.618$”,建立知识之间的联系。 - **公式条件补充**:在“2.1 算法原理”中,公式 $\gcd(a, b) = \gcd(b, a \bmod b)$ 前加上“当 $b \ne 0$ 时”,使公式表达更精确。 - **自动交换描述优化**:在“2.2 算法步骤”中,将“算法要求 $a \geq b$,若 $a < b$,第一步执行后会自动交换位置”改为“即使 $a < b$,由于 $a \bmod b = a$,下一步将变为 $\gcd(b, a)$,因此算法能自动处理大小顺序”,表述更严谨。 - **通解公式说明**:在“3.1 贝祖等式”中,通解公式 $\begin{align*}x&#39; &= x + k \cdot \frac{b}{\gcd(a,b)}\\y&#39; &= y - k \cdot \frac{a}{\gcd(a,b)}\end{align*}$ 后注明“其中 $k \in \mathbb{Z}$”,明确变量的取值范围。 - **线性同余解说明**:在“5.2 线性同余方程求解”中,对于解为 $x \equiv x_0 \cdot \frac{b}{d} \pmod{\frac{m}{d}}$ 的表述,明确指出“设 $(x_0, y_0)$ 是方程 $ax + my = d$ 的一组整数解,则原同余方程的一个特解为 $x^* = x_0 \cdot \frac{b}{d}$,通解为 $x \equiv x^* \pmod{\frac{m}{d}}$”,避免歧义。 - **拉梅定理表述优化**:在“4. 算法复杂度分析”中,将“拉梅定理指出,欧几里得算法所需的除法步数超过较小数的十进制位数的5倍”改为“拉梅定理指出,对于正整数 $a > b$,欧几里得算法所需的除法次数最多为 $5d$,其中 $d$ 是 $b$ 的十进制位数(即 $d = \lfloor \log_{10} b \rfloor + 1$),这提供了紧致的上界估计”,使表述更准确。 #### 示例补充 - **例2完整计算**:在“2.3 示例演示”中,补全例2“计算 $\gcd(33, 92)$”的中间步骤: - $92 \div 33 = 2$ 余 $26$ - $33 \div 26 = 1$ 余 $7$ - $26 \div 7 = 3$ 余 $5$ - $7 \div 5 = 1$ 余 $2$ - $5 \div 2 = 2$ 余 $1$ - $2 \div 1 = 2$ 余 $0$ - 故 $\gcd(33, 92) = 1$ - **模逆元示例**:在“5.3 密码学应用:模逆元计算”中,补充具体示例,如求7在模19下的逆元: - 使用扩展欧几里得算法求解 $7x + 19y = \gcd(7, 19) = 1$。 - 计算过程: - $19 \div 7 = 2$ 余 $5$ - $7 \div 5 = 1$ 余 $2$ - $5 \div 2 = 2$ 余 $1$ - 然后回代: - $1 = 5 - 2 \times 2$ - $2 = 7 - 5 \times 1$,代入上式得 $1 = 5 - 2 \times (7 - 5 \times 1) = 3 \times 5 - 2 \times 7$ - $5 = 19 - 7 \times 2$,代入上式得 $1 = 3 \times (19 - 7 \times 2) - 2 \times 7 = 3 \times 19 - 8 \times 7$ - 所以 $x = -8$,$y = 3$,$7$ 在模 $19$ 下的逆元为 $x \bmod 19 = -8 \bmod 19 = 11$。 - **线性同余无解示例**:在“5.2 线性同余方程求解”中,增加无解情况的示例,如求解 $2x \equiv 3 \pmod{4}$: - 令 $d = \gcd(2, 4) = 2$,因为 $2 \nmid 3$,所以方程无解。 ###
最新发布
10-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值