#include
#include
void calc(int p[9])
{
if (p[0] == 0 // 为了保证第一个数为三位数
|| p[3] == 0 // 为了保证第二个数为两位数
|| p[5] == 0) { // 为了保证第三个数为四位数
return ;
}
int num[3] = {0};
num[0] = p[0] * 100 + p[1] * 10 + p[2];
num[1] = p[3] * 10 + p[4];
num[2] = p[5] * 1000 + p[6] * 100 + p[7] * 10 + p[8];
if (num[0] * num[1] == num[2]) {
printf ("%d * %d == %d\n", num[0], num[1], num[2]);
}
}
// 检查p[k]这个值在p[0]~p[k-1]中是否出现过,出现过返回true
bool is_used(int p[9], int k)
{
int i;
for (i = 0; i < k; i++) {
if (p[i] == p[k]) {
return true;
}
}
return false;
}
int main(int argc, char *argv[])
{
int p[9] = {0};
int k = 0;
p[k] = -1;
// 回溯法
while (k >= 0) {
for (p[k]++; p[k] <= 9; p[k]++) { // 这个for循环是找当前p[k]的值
if (!is_used(p, k)) { // 且不能与前面已有的数重复
break;
}
}
if (p[k] > 9) { // 如果数字超出范围,回退
p[k--] = -1;
} else if (k == 8) { // 达到所需规模,计算
calc(p);
} else { // 否则,一切正常,前进
p[++k] = -1;
}
}
return 0;
}
这种解法用到的算法是回溯法,你可以在网上先查一下这种算法。
它差不多是万能算法,如果一时找不到更好的算法,那就用它了。
#include
const int NUM = 9;
void swap(int *a, int *b)
{
int m;
m = *a;
*a = *b;
*b = m;
}
void perm(int list[], int k, int m)
{
int i;
if(k > m)
{
if((list[m-8]*100+list[m-7]*10+list[m-6])*(list[m-5]*10+list[m-4])==(list[m-3]*1000+list[m-2]*100+list[m-1]*10+list[m]))
{
for(i = 0; i <= m; i++)
printf("%d ", list[i]);
printf("\n");
}
}
else
{
for(i = k; i <= m; i++)
{
swap(&list[k], &list[i]);
perm(list, k + 1, m);
swap(&list[k], &list[i]);
}
}
}
int main()
{
int list[NUM];
for(int i = 0 ; i < NUM ; ++i)
list[i] = i+1;
perm(list, 0, NUM - 1);
return 0;
}
鼓捣了半天,可算成了,你试一下~~~