题目描述:https://vjudge.net/problem/UVA-725
此题采用暴力枚举法。没必要枚举0~9的所有排列。只需要枚举fghij就可以算出abcde,然后判断是否所有数字都不相同即可。不仅程序简单,而且枚举量也从10!=3628800降低至不到1万,而且当abcde和fghij加起来超过10位时可以终止枚举。由此可见,即使采用暴力枚举,也是需要认真分析问题的。
#include<iostream>
using namespace std;
int num;
int used[10];
int judge(int a,int b)
{
if(b>98765)
return 0;
for(int i=0;i<10;i++)
used[i]=0;
if(a<10000)used[0]=1;
while(a)
{
used[a%10]=1;
a/=10;
}
while(b)
{
used[b%10]=1;
b/=10;
}
int sum=0;
for(int i=0;i<10;i++)
sum+=used[i];
return (sum==10);
}
void fun(int n)
{
for(int i=1234;i<=98765;i++)
{
if(judge(i,i*n))
{printf("%05d / %05d = %d\n",i*n,i,n);num++;}
}
if(num==0)
printf("There are no solutions for %d.\n",n);
}
int main()
{
int n;int flag=0;
scanf("%d",&n);
while(n!=0)
{
num=0;
if(flag==0)
flag=1;
else
printf("\n");
fun(n);
scanf("%d",&n);
}
return 0;
}