题目链接
直接枚举第一个数字,然后如果可以整除n的话除以n得到第二个数字判断第二个数字是否满足条件,我感觉我的代码好长长长。。。
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define inf 0x3f3f3f3f
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rep1(i,a,b) for(int i=a;i>=b;i--)
#define rson rt<<1|1,m+1,r
#define lson rt<<1,l,m
using namespace std;
const int N=100;
int vis[N];
int arr[N];
int n;
bool dfs(int cnt)
{
if(cnt==5)
{
int pre[20]={0};
int sum=0;
rep(i,0,5)
{
int j=4-i;
int te=arr[i];
for(j;j>0;j--)
{
te*=10;
}
sum+=te;
}
if(sum%n==0)
{
int sum1=sum/n;
if(sum1>1000)
{
if(sum1<10000&&!vis[0])
{
pre[0]=1;
int aa=sum1;
while(aa)
{
int a=aa%10;
if(vis[a]||pre[a])return 0;
pre[a]=1;
aa/=10;
}
cout<<sum<<" / 0"<<sum1<<" = "<<n<<endl;
return 1;
}
else if(sum1>10000)
{
int aa=sum1;
while(aa)
{
int a=aa%10;
if(vis[a]||pre[a])return 0;
pre[a]=1;
aa/=10;
}
cout<<sum<<" / "<<sum1<<" = "<<n<<endl;
return 1;
}
}
}
return 0;
}
int pp=0;
rep(i,0,10)
{
if(cnt==0&&i==0) continue;
if(!vis[i])
{
arr[cnt]=i,vis[i]=1;
if(dfs(cnt+1))
pp=1;
vis[i]=0 ;
}
}
if(pp) return 1;
else return 0;
}
int main()
{
ios::sync_with_stdio(false);
int ans=0;
while(cin>>n&&n)
{
if(ans!=0) cout<<endl;
ans++;
memset(vis,0,sizeof vis);
if(!dfs(0))
cout<<"There are no solutions for "<<n<<"."<<endl;
}
return 0;
}