程序代码:
a[0]a[1] * b[0]b[1] == c[0]c[1] * d[0]d[1]d[2] ==> a[0] * b[0] > 10 && c[0] * d[0] < 10 && a[0] * b[0] / 10 == c[0] * d[0] && a[1] * b[1] % 10 == c[1] * d[2] % 10
[ 本帖最后由 voidx 于 2011-8-5 23:28 编辑 ]
// 这个全排列算法按照字典顺序依次生成下一个排列 // 要得到全排列,排列元素初始状态需按升序排列 // 优点在于可以逐个生成排列,而不是一旦运行就会生成所有排列 #include <stdio.h> void swap(char * a, char * b) { char c = *a; *a = *b; *b = c; } char next_permutation(char s[], int l) { int i = 0, j = 0; // 找到最大的 i 值,使得 a[i] < a[i + 1] for (i = l - 2; i >= 0 && s[i] > s[i + 1]; i--); // 如果不存在这样的 i 值,则说明当前状态已经是字典顺序最后一个排列 if (i < 0) { return 0; } // 找到最大的 j 值,使得 a[i] < a[j] for (j = l - 1; s[j] <= s[i]; j--); // 交换 a[i] 与 a[j] swap(&s[i], &s[j]); // 从 a[i + 1] 开始到 a[l - 1],逆序 for (i++, j = l - 1; i < j; i++, j--) { swap(&s[i], &s[j]); } return 1; } int main(int argc, char* argv[]) { char s[5] = {'1', '2', '3', '4', 0}; int l = 4; printf("%s\n", s); while (next_permutation(s, l)) { printf("%s\n", s); } return 0; }