看了洛谷的几篇题解之后,感觉自己的代码思路更明确,洛谷那边也交不上题解了,就只好写在这里咯~
先直接放题目吧~
思路
当模拟题来做,先枚举第一个数,首先要明确对一个数是否合法的几个条件:
1. 各个位上的数字互不相同
2. 各个位上的数字在1 ~ 9之间,并且没有出现过
最后顺着上面条件来写代码就可。
AC代码
#include<iostream>
#include<cstring>
using namespace std;
int nums[10]; // 记录各个位上 0~9 数字出现次数
// 检验数字是否合法
bool check(int x){
int a = x / 100; // 因为三位数的局限性,直接提取三个位数上的数字即可
int b = (x / 10) % 10;
int c = x % 10;
if(a == b || a == c || b == c || !a || !b || !c) return false; // 判断一个数中均不同且不为 0
if(nums[a] != 0 || nums[b] != 0 || nums[c] != 0) return false; // 判断各个位数的数字是否已经用过
else{
nums[a]++;
nums[b]++;
nums[c]++;
return true;
}
}
int main(){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
bool flag = false; // 用于判断是否有符合题意的数成立
for(int i = 123;i < 330;i++){ // 循环范围根据题目设置化简
memset(nums, 0, sizeof nums);
if(!check(i)) continue;
if(i * b / a > 987 || i * c / a > 987) break; // 优化:数字已经超出范围直接break (有点吹毛求疵)
if(check(i * b / a) && check(i * c / a)){
flag = true;
printf("%d %d %d\n", i, i * b / a, i * c / a);
}
}
if(!flag) cout << "No!!!" << endl;
return 0;
}