暴力枚举。
当然不是把十个全部枚举,不然妥妥的超时~
只需要枚举一部分,另一部分根据题目给的数推出即可,题意比较明显。
我这里打了一个表,便于枚举。
但实际上直接for循环1234到98765,然后judge两个数更省时间,打表多次一举了。
#include<stdio.h>
#include<string>
#include<algorithm>
using namespace std;
int b[30250];
int k;
void cal()
{
for(int i=0;i<=9;i++)
for(int i1=0;i1<=9;i1++)
for(int i2=0;i2<=9;i2++)
for(int i3=0;i3<=9;i3++)
for(int i4=0;i4<=9;i4++)
if(i!=i1&&i!=i2&&i!=i3&&i!=i4&&i1!=i2&&i1!=i3&&i1!=i4&&i2!=i3&&i2!=i4&&i3!=i4)
b[k++]=i*10000+i1*1000+i2*100+i3*10+i4;
}
bool judge(int a,int b)
{
int c[11];
for(int i=0;i<=9;i++)
c[i]=0;
if(b<10000) c[0]=1;
if(a<10000) c[0]=1;
while(a!=0){
c[a%10]=1;
a/=10;
}
while(b!=0){
c[b%10]=1;
b/=10;
}
int sum=0;
for(int i=0;i<=9;i++)
sum+=c[i];
if(sum==10) return true;
else return false;
}
int main()
{
cal();
// printf("%d\n",k);
// for(int i=0;i<k;i++)
// printf("%d ",b[i]);
//printf("%d",b[30239]);
int n,cas=0;;
while(scanf("%d",&n)&&n)
{
if(cas++) printf("\n");
int qq=0;
for(int i=0;i<=30239;i++)
if((b[i]%n==0)&&(b[i]/n>1000))
{
int t=b[i]/n;
bool flag=judge(b[i],t);
if(flag)
{printf("%05d / %05d = %d\n",b[i],t,n);qq++;}
}
// printf("%d",qq);
if(qq==0)
printf("There are no solutions for %d.\n",n);
}
return 0;
}