18443 除法等式
Description
输入正整数n,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中aj各代表09中的一个数字
除了0可以重复外,其它数字不能重复,2<=n<=90000。
输入格式
多case,每行一个数字,最后一个数字是0
输出格式
除了最后一行0不用处理, 其它每个case,按被除数由小到大输出所有满足等式的情况
注:如果没有满足条件的等式,该case结束后,也需要输出一个空行
分析
不需要枚举分母+分子,只需要枚举分子,分子*n就是分母,先计算出分子最大值,当超过时直接退出,设置一个标记数组,里面的数只要大于1就表明当前分子分母有除1外重复的数字。
源码
#include <iostream>
using namespace std;
int a[10]={-100,0,0,0,0,0,0,0,0,0};
int main()
{
int n;
while(cin>>n&&n)
{
int i,j,k,y,q,w,flag,num,mu;
int max=98765/n;
for(i=0;i<=9;i++)
{
for(j=0;j<=9;j++)
{
if(j==0||j!=i)
{
for(k=0;k<=9;k++)
{
if(k==0||k!=i&&k!=j)
{
for(y=0;y<=9;y++)
{
if(y==0||y!=k&&y!=j&&y!=i)
{
for(q=0;q<=9;q++)
{
if(q==0||q!=y&&q!=k&&q!=j&&q!=i)
{
num=i*10000+j*1000+k*100+y*10+q;
mu=num*n;
if(num>max) goto loop;
else
{
a[i]+=1;a[j]+=1;a[k]+=1;a[y]+=1;a[q]+=1;
a[mu/10000%10]+=1;a[mu/1000%10]+=1;
a[mu/100%10]+=1;a[mu/10%10]+=1;
a[mu%10]+=1;
flag=0;
for(w=0;w<=9;w++)
{
if(a[w]>1)
{
flag=1;break;
}
}
if(!flag&&mu!=0)
printf("%05d/%05d=%d\n",mu,num,n);
a[0]=-100;a[1]=a[2]=a[3]=a[4]=a[5]=a[6]=a[7]=a[8]=a[9]=0;
}
}
}
}
}
}
}
}
}
}
loop: printf("\n");
}
return 0;
}