思路:
sum1代表被除数
sum2代表除数
flag1代表是否重复,flag2代表是否有结果
dig[]存各位数
已知n
n*sum2=sum1,
所以枚举sum2即可,枚举完sum2加个预判断(sum2各位是不是相同,减少后续计算量)
计算出sum1,提取出sum1各数字
判断sum1和sum2各位是否相同(这里巧妙在可以用数组,然后两个for循环即可)
不同,flag1=1,flag2=1可以输出结果
相同,flag1=0,flag2=0,输出0
一开始想的用fghji去表示,但是这样的话后面去判断每一位数字是否相同遍历起来很麻烦,换一种思路,如果用数组就很简单了
1234*1
一直到
1234*10
一直有重复数字
可以认为最小的除数>10000,这样可以减少运算量
for (int i = 0; i < 10; i++){
for (int j = i+1; j <10; j++){
}
}
代码如下
#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int dig[10];//存放每一位数,
bool flag1, flag2;//flag1判断是否相同 =0为重复,=1为不重复 flag2判断是否有结果
int main()
{
int n, sum1, sum2;//n代表输入的数,sum代表后一个数
scanf("%d", &n);
for (dig[0] = 0; dig[0] < 10; dig[0]++)
for (dig[1] = 0; dig[1] < 10; dig[1]++)
for (dig[2] = 0; dig[2] < 10; dig[2]++)
for (dig[3] = 0; dig[3] < 10; dig[3]++)
for (dig[4] = 0; dig[4] < 10; dig[4]++){
if(dig[0]!=dig[1] && dig[0]!=dig[2]
&& dig[0]!=dig[3] && dig[0]!=dig[4] && dig[1]!=dig[2]
&& dig[1]!=dig[3] && dig[1]!=dig[4] && dig[2]!=dig[3]
&& dig[2]!=dig[4] && dig[3]!=dig[4] ) {
sum1 = dig[0] * 10000 + dig[1] * 1000 + dig[2] * 100 + dig[3] * 10 +dig[4];
sum2 = sum1 * n;
if(9999 < sum2 && sum2 < 100000){
dig[5]=sum2/10000;
dig[6]=(sum2%10000)/1000;
dig[7]=(sum2%1000)/100;
dig[8]=(sum2%100)/10;
dig[9]=sum2%10;
flag1 = 1;
for (int h = 0; h < 10; h++)
for (int m = h + 1; m < 10; m++)
if (dig[h] == dig[m]) {
flag1 = 0;
}
if (flag1){
flag2 = 1;//无重复代表有结果
printf("%d / ", sum2);
for (int w =0; w < 5; w++){
printf("%d", dig[w]);
}
printf("=%d", n);
printf("\n");
}
}
}
}
if(!flag2) printf("0");
return 0;
}