user-0 提问: 救救孩子吧

回复:
user: user-0
content: 引用 5 楼 rrrr336的回复:楼上 @tryagain2006 的主意非常高。以下是循着他的思路做下去的。  我解释一下：  作一个 1 到 9 的全排列，这样就保证1-9都用 且 只用一次。 把它 分成四个部分，比如：123456789，分成12， 34， 56， 789， 检查12  *  34   和    56  *  789， 看它们是否相等就可以了。  于是，问题就转换为 求 1 - 9 的全排列， 检查每一个排列，找出符合要求的排列。  这个穷举 的循环次数 总共为：  9 ！ =   362880 次，运行非常快。  全排列使用 递归的方法，借鉴了网上现成的算法，特此说明。  程序如下：  #include<stdio.h> void perm(int k, int n, int a[]){     if (k == n-1){         int d1 = a[0] * 10 + a[1];         int d2 = a[2] * 10 + a[3];         int d3 = a[4] * 10 + a[5];         int d4 = a[6] * 100 + a[7] * 10 + a[8];         if (d1 * d2 == d3 * d4){             printf("%2d * %2d = %2d * %3d \n", d1, d2, d3, d4);         }     }     else{         for(int i = k; i < n; i++){             int temp = a[k];             a[k] = a[i];             a[i] = temp;             perm(k+1, n, a);             temp = a[k];             a[k] = a[i];             a[i] = temp;         }     } }  int main(){     int arr[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};     perm(0, 9, arr);     return 0; }  结果是：  46 * 79 = 23 * 158  54 * 69 = 27 * 138  54 * 93 = 27 * 186  58 * 67 = 29 * 134  58 * 69 = 23 * 174  58 * 73 = 29 * 146  58 * 96 = 32 * 174  63 * 74 = 18 * 259  64 * 79 = 32 * 158  67 * 58 = 29 * 134  69 * 54 = 27 * 138  69 * 58 = 23 * 174  73 * 58 = 29 * 146  73 * 96 = 12 * 584  74 * 63 = 18 * 259  76 * 98 = 14 * 532  79 * 46 = 23 * 158  79 * 64 = 32 * 158  93 * 54 = 27 * 186  96 * 58 = 32 * 174  96 * 73 = 12 * 584  98 * 76 = 14 * 532 感谢🙏，我也是这样想的，但是我不会写，感谢大佬

user: user-1
content: 引用 5 楼 rrrr336 的回复:楼上 @tryagain2006 的主意非常高。以下是循着他的思路做下去的。  我解释一下：  作一个 1 到 9 的全排列，这样就保证1-9都用 且 只用一次。 把它 分成四个部分，比如：123456789，分成12， 34， 56， 789， 检查12  *  34   和    56  *  789， 看它们是否相等就可以了。  于是，问题就转换为 求 1 - 9 的全排列， 检查每一个排列，找出符合要求的排列。  这个穷举 的循环次数 总共为：  9 ！ =   362880 次，运行非常快。  全排列使用 递归的方法，借鉴了网上现成的算法，特此说明。  程序如下：  #include<stdio.h> void perm(int k, int n, int a[]){     if (k == n-1){         int d1 = a[0] * 10 + a[1];         int d2 = a[2] * 10 + a[3];         int d3 = a[4] * 10 + a[5];         int d4 = a[6] * 100 + a[7] * 10 + a[8];         if (d1 * d2 == d3 * d4){             printf("%2d * %2d = %2d * %3d \n", d1, d2, d3, d4);         }     }     else{         for(int i = k; i < n; i++){             int temp = a[k];             a[k] = a[i];             a[i] = temp;             perm(k+1, n, a);             temp = a[k];             a[k] = a[i];             a[i] = temp;         }     } }  int main(){     int arr[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};     perm(0, 9, arr);     return 0; }  结果是：  46 * 79 = 23 * 158  54 * 69 = 27 * 138  54 * 93 = 27 * 186  58 * 67 = 29 * 134  58 * 69 = 23 * 174  58 * 73 = 29 * 146  58 * 96 = 32 * 174  63 * 74 = 18 * 259  64 * 79 = 32 * 158  67 * 58 = 29 * 134  69 * 54 = 27 * 138  69 * 58 = 23 * 174  73 * 58 = 29 * 146  73 * 96 = 12 * 584  74 * 63 = 18 * 259  76 * 98 = 14 * 532  79 * 46 = 23 * 158  79 * 64 = 32 * 158  93 * 54 = 27 * 186  96 * 58 = 32 * 174  96 * 73 = 12 * 584  98 * 76 = 14 * 532 其实，这道题目还有一个思路，就是借鉴8后问题的非递归算法，这样程序的效率是一样比较高的。

user: user-2
content: 如果用 Python 写的话，就下面9行就解决问题了。运行结果一样。 真是应了那句话： “人生苦短，我用Python” “Life is short, you need Python!”    from itertools import permutations a = [1, 2, 3, 4, 5, 6, 7, 8, 9] for p in permutations(a):     d1 = p[0] * 10 + p[1]     d2 = p[2] * 10 + p[3]     d3 = p[4] * 10 + p[5]     d4 = p[6] * 100 + p[7] * 10 + p[8]     if d1 * d2 == d3 * d4:         print(d1, "*", d2, "=", d3, "*", d4)

user: user-2
content: 楼上 @tryagain2006 的主意非常高。以下是循着他的思路做下去的。  我解释一下：  作一个 1 到 9 的全排列，这样就保证1-9都用 且 只用一次。 把它 分成四个部分，比如：123456789，分成12， 34， 56， 789， 检查12  *  34   和    56  *  789， 看它们是否相等就可以了。  于是，问题就转换为 求 1 - 9 的全排列， 检查每一个排列，找出符合要求的排列。  这个穷举 的循环次数 总共为：  9 ！ =   362880 次，运行非常快。  全排列使用 递归的方法，借鉴了网上现成的算法，特此说明。  程序如下：  #include<stdio.h> void perm(int k, int n, int a[]){     if (k == n-1){         int d1 = a[0] * 10 + a[1];         int d2 = a[2] * 10 + a[3];         int d3 = a[4] * 10 + a[5];         int d4 = a[6] * 100 + a[7] * 10 + a[8];         if (d1 * d2 == d3 * d4){             printf("%2d * %2d = %2d * %3d \n", d1, d2, d3, d4);         }     }     else{         for(int i = k; i < n; i++){             int temp = a[k];             a[k] = a[i];             a[i] = temp;             perm(k+1, n, a);             temp = a[k];             a[k] = a[i];             a[i] = temp;         }     } }  int main(){     int arr[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};     perm(0, 9, arr);     return 0; }  结果是：  46 * 79 = 23 * 158  54 * 69 = 27 * 138  54 * 93 = 27 * 186  58 * 67 = 29 * 134  58 * 69 = 23 * 174  58 * 73 = 29 * 146  58 * 96 = 32 * 174  63 * 74 = 18 * 259  64 * 79 = 32 * 158  67 * 58 = 29 * 134  69 * 54 = 27 * 138  69 * 58 = 23 * 174  73 * 58 = 29 * 146  73 * 96 = 12 * 584  74 * 63 = 18 * 259  76 * 98 = 14 * 532  79 * 46 = 23 * 158  79 * 64 = 32 * 158  93 * 54 = 27 * 186  96 * 58 = 32 * 174  96 * 73 = 12 * 584  98 * 76 = 14 * 532

user: user-3
content: for (int k = 11; k < 100; k++)    {       for (int i = k + 1; i < 100; i++)       {          for (int j = k + 1; j < 100; j++)          {             if (i * j % k == 0 && i * j / k >= 111 && i * j / k < 1000)             {                printf("%dx%d=%dx%d\n", i, j, k, i*j/k);             }          }       }    }

user: user-1
content: 这道题可以看做是将数字 1~9 进行一个不重复的全排列。关键是要尽量提高进行全排列的效率。 实在不愿意写程序了。

user: user-1
content: 引用 1 楼 user-3 的回复:for (int k = 11; k < 100; k++)    {       for (int i = k + 1; i < 100; i++)       {          for (int j = k + 1; j < 100; j++)          {             if (i * j % k == 0 && i * j / k >= 111 && i * j / k < 1000)             {                printf("%dx%d=%dx%d\n", i, j, k, i*j/k);             }          }       }    } 题目要求数字不重复，这段程序没有判断数字重复问题。