输入正整数 n ,按从小到大的顺序输出所有 形如 abcde/fghij = n 的表达式,其中
a~j 恰好为数字 0~9 的一个排列(可以有 前导 0),2<=n<=79
样例输入
62
样例输出
79546/ 01283 = 62
94736/ 01528 = 62
/*是紫书上的一个 例题
首先方法就是 枚举,但是枚举时对问题进行一些分析能让代码简洁
本题就是 不需要去枚举 0~9 排列,只需要枚举 fghij 就可以算出 abcde ,然后判断是否所有数字都不相同即可,不需要列举 10 个循环
终止条件就是 被除数要小于 98765 (因为 要不相同的数字才满足条件,所以 98776 是不满足条件的)
注意的是:
1、被除数是不能有前导 0 的,除数可以有前导0
如果被除数有 0 的话,其实就是一个 四位数,那么除数是 4位数的话,不满足条件 ,若是 5 位数,则得到的商是 小数
2、for 循环的起始和终止条件,由于每一位上的数都是不同的,所以就从 1234开始,然后 98765结束 就 OK
3、输出格式 ,要满足 5 位数并有可能是 前导 0的情况,所以就 输出 %05d
4、由于 i 是从小到大循环的,所以输出的时候一定是按 从小到大输出的,不必再去考虑顺序问题
*/
代码 1(被调) :
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int divv(int a,int b)
{
int s[15]={0},i,sum=0;//定义s数组,来存每一位数出现了几次
memset(s,0,sizeof(s));
if(b>98765)// 终止条件
return 0;
if(a<10000)//代表 除数 有前导 0,那么就另 0 为 1,特判
s[0]=1;
while(a)
{
s[a%10]++;
a/=10;
}
while(b)
{
s[b%10]++;
b/=10;
}
for(i=0;i<=9;i++)
if(s[i]==1)//代表就出现了一次,才是满足条件的
sum++;
if(sum==10)//如果 10 个数都不相同的话,就满足条件
return 1;
else
return 0;
}
int main()
{
int n,i,b,m,flag,sum=0,z,sum1=0;
while(~scanf("%d",&n))
{
m=0;
for(i=1234;i<=98765;i++)
{
m=0;
b=i*n;
m=divv(i,b);
if(m==1){
printf("%05d/%05d=%d",b,i,n);
printf("\n");
}
}
}
}
代码 2 :
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
int n,i,j,b,m,a,flag,sum=0,z,sum1=0;
int s[15]={0};
while(~scanf("%d",&n))
{
m=0;
for(i=1234;i<=98765;i++)
{
sum=0;
memset(s,0,sizeof(s));
a=i;
b=i*n;
m=b;
if(b>98765)
break;
if(a<10000)
s[0]=1;
while(a)
{
s[a%10]++;
a/=10;
}
while(b)
{
s[b%10]++;
b/=10;
}
for(j=0;j<=9;j++)
if(s[j]==1)
sum++;
if(sum==10)
printf("%05d/%05d=%d\n",m,i,n);
else
continue;
}
}
}