解法一:枚举法(暴力穷举)
#include<stdio.h>
int main()
{
int c, d, e, f, g, h, i, j, k, n2, n3;
for (c = 1; c < 10; c++)
{
for (d = 0; d < 10; d++)
{
for (e = 0; e < 10; e++)
{
for (f = 0; f < 10; f++)
{
for (g = 1; g < 10; g++)
{
for (h = 0; h < 10; h++)
{
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
for (k = 0; k < 10; k++)
{
n2 = 1000 * c + 100 * d + 10 * e + f;
n3 = 10000 * g + 1000 * h + 100 * i + 10 * j + k;
if(c != d && c != e && c != f && c != g && c != h && c != i && c != j && c != k
&& d != e && d != f && d != g && d != h && d != i && d != j && d != k
&& e != f && e != g && e != h && e != i && e != j && e != k
&& f != g && f != h && f != i && f != j && f != k
&& g != h && g != i && g != j && g != k
&& h != i && h != j && h != k
&& i != j && i != k
&& j != k && n3 == 2 * n2)
{
printf(" 2\n");
printf("* %d%d%d%d\n", c, d, e, f);
printf("---------\n");
printf(" %d%d%d%d%d\n\n", g, h, i, j, k);
}
}
}
}
}
}
}
}
}
}
return 0;
}
解法二:调用子函数判断各位数是否相同
#include<stdio.h>
int pd(int e,int f)
{
int a[4] = { -1 },g[5] = { -1 };
int i = 0,t=0,k;
while (e)
{
a[i++] = e % 10;
for (k = 0; k < i; k++)
{
if (a[i-1] == a[k]&&i-1!=k)
{
return 0;
}
}
e=e / 10;
}
while (f)
{
g[t++] = f % 10;
for (k = 0; k < t; k++)
{
if (g[t - 1] == g[k] && t - 1 != k)
{
return 0;
}
}
for (k = 0; k < 4; k++)
{
if (g[t - 1] == a[k])
{
return 0;
}
}
f = f/ 10;
}
return 1;
}
int main()
{
int b, c,d;
for (b= 10000; b < 100000;b++)
{
for (c = 1000; c < 10000; c++)
{
d = 2 * c;
if (pd(c, b) && d == b)
{
printf(" 2\n");
printf("* %d\n", c);
printf("---------\n");
printf(" %d\n", b);
}
}
}
return 0;
}
解法三:数组做标记判断是否被使用
#include<stdio.h>
int pd(int a, int b)
{
int c[10] = { 0 };
int i;
while (a)
{
c[a % 10]++;
a = a / 10;
}
while (b)
{
c[b % 10]++;
b = b / 10;
}
for (i = 0; i < 10; i++)
{
if (c[i] > 1)
return 0;
}
return 1;
}
int main()
{
int n, m,t=0;
for (n = 10000; n < 100000; n++)
{
for (m = 1000; m < 10000; m++)
{
if ((2 * m == n) && pd(n, m))
{
t++;
printf("算式%d\t2*%d=%d\n\n",t,m,n);
}
}
}
return 0;
}
解法四:回溯递归法
回溯递归就是还是利用数组给全部赋值0;然后两个数分别去在数组取下标,如果数组值为0代表可取,然后一次取一个数,然后一直递归取完数符合条件输出一个,然后再回去,再进行取数,一直到取完所有情况,不符合的时候再返回递归的上一次。