https://www.luogu.com.cn/problem/P1618
1 #include<bits/stdc++.h> 2 using namespace std; 3 int a, b, c; 4 int dic[10]; //用于判断是否1-9每个数都出现过 5 bool check1(int n){ //检查各位数上是否有0 或 任意两位相等 6 int ge, shi, bai; 7 ge=n%10; shi=n/10%10; bai=n/100; 8 return ge!=shi && ge!=bai && shi!=bai && ge!=0 && shi!=0 && bai!=0; 9 } 10 bool check2(int x, int y, int z){ //检查x, y, z各位数上是否有相同数字 11 memset(dic, 0, sizeof(dic)); //将数组dic初始化为0,假定都没有出现 12 dic[x/100]=1; dic[x/10%10]=1; dic[x%10]=1; //将出现的数字值赋值为1 13 dic[y/100]=1; dic[y/10%10]=1; dic[y%10]=1; 14 dic[z/100]=1; dic[z/10%10]=1; dic[z%10]=1; 15 16 for(int i=1; i<10; i++){ //通过循环来判断1-9是否没有出现 17 if(dic[i]==0)return 0; 18 } 19 return 1; 20 } 21 int main() 22 { 23 bool f=1;//假定结果为“No!!!” 24 cin>>a>>b>>c; 25 for(int x=100; x<1000; x++){ 26 if(!check1(x))continue; //检查x各位数上是否有0 或 任意两位相等 27 int y=b*x/a; //通过a:b=x:y计算y的结果 28 if(!check1(y))continue; //检查y各位数上是否有0 或 任意两位相等 29 int z=c*x/a; //通过a:c=x:z计算z的结果 30 if(!check1(z))continue; //检查z各位数上是否有0 或 任意两位相等 31 if(c*y!=b*z)continue; //检查b:c==y:z; 32 if(check2(x, y, z)){ //检查x, y, z各位数上是否有相同数字,见check2函数 33 cout<<x<<" "<<y<<" "<<z<<endl; 34 f=0; 35 } 36 } 37 if(f) //特判答案为 "No!!!"的情况 38 cout<<"No!!!"; 39 return 0; 40 }
切勿跟上一题一样,一位一位去暴力,或3位3位去暴力!尤其要注意根据题意排除没有必要的枚举!