程序代码: 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;
}