- 先把符合条件的单个数筛出来,总共三万多;
- 对于给定的n,在筛出来的数中从小到大枚举除数,直到n*当前数>=筛出来的最大数;
- 在满足前面的条件的基础上进一步判断能否组成排列。
- 代码又臭又长!
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
bool ok[100005],a[10],e;
int q[100005],pos,n,num,aa[10];
void getpl(int x,int ans)
{
if(x==5)
{
ok[ans]=1;
q[++pos]=ans;
return ;
}
int xi;
switch(x)
{
case 0:
xi=10000;
break;
case 1:
xi=1000;
break;
case 2:
xi=100;
break;
case 3:
xi=10;
break;
case 4:
xi=1;
break;
}
for(int i=9;i>=0;i--)
{
if(!a[i])
{
a[i]=1;
getpl(x+1,ans+i*xi);
a[i]=0;
}
}
}
bool pai(int c,int b)
{
int ans=0;
for(int i=0;i<=9;i++) a[i]=0;
while(c!=0)
{
if(a[c%10])
return 0;
ans+=(a[c%10]?0:1);
a[c%10]=1;
c/=10;
}
while(b!=0)
{
if(a[b%10])
return 0;
ans+=(a[b%10]?0:1);
a[b%10]=1;
b/=10;
}
ans+=(!a[0]);
return ans==10;
}
int main()
{
getpl(0,0);
while(cin>>n&&n)
{
if(e)
cout<<endl;
num=0;
for(int i=pos;i>=1&&n*q[i]<=q[1];i--)
if(ok[n*q[i]]&&pai(n*q[i],q[i]))
{
num++;
printf("%05d / %05d = %d\n",n*q[i],q[i],n);
}
if(!num)
cout<<"There are no solutions for "<<n<<'.'<<endl;
e=1;
}
}