题目链接:
暴力枚举的入门题,难度主要在细节处理上(比如前导0在记录时的处理,还有输出时的处理),就当是输入输出练习了。代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <cmath>
using namespace std;
typedef long long ll;
int tmp[10]; // 记录每一位是否用过
bool check(int a, int b){
memset(tmp, 0, sizeof(tmp)); // 重置tmp数组
if(b > 99999) return false; // 如果被除数超过五位,不符合题意
for(int i=0; i<5; i++){ // 循环遍历五次,可以把前导0也记入,这里很巧妙
tmp[a % 10]++;
tmp[b % 10]++;
a /= 10;
b /= 10;
}
for(int i=0; i<10; i++){ // 只有当所有数字都是用过一次,才是符合题意的答案
if(tmp[i] != 1) return false;
}
return true;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n, kase = 0; // kase用来控制换行
while(cin >> n && n){
if(kase++ > 0) printf("\n");
bool flag = false; // 控制是否找到了有效结果
for(int i=1234; i<50000; i++){ // n最小为2,而5w * 2 = 10w,已经超过i*n要求的五位数了,所以i遍历到5w-1即可
if(check(i, i*n)){
flag = true; // 找到了符合题意的结果
printf("%05d / %05d = %d\n", i*n, i, n); // 注意这里用%05f来控制前导0输出
}
}
if(!flag) printf("There are no solutions for %d.\n", n); // 没找到符合题意的结果
}
return 0;
}