洛谷-P1618 三连击(升级版)
程序员文章站
2023-12-24 22:02:39
题目描述 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”。
题目描述
将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是a:b:c,试求出所有满足条件的三个三位数,若无解,输出“no!!!”。
输入格式
三个数,a b c。
输出格式
若干行,每行3个数字。按照每行第一个数字升序排列。
输入输出样例
输入 #1
1 2 3
输出 #1
192 384 576 219 438 657 273 546 819 327 654 981
说明/提示
保证a<b<c
题目大意及分析
题目要求就是在1~9九个数中三个数为一组排列,组成三个三位数,并且需要满足 a:b:c 的比例。
因为这三个数不能重复选,所以可以得到最小的一个三位数为123。所以就可以从123开始暴力求解了,有两个小细节如下:
- 所得到的三位数中不能含有0这个数。
- 这个三位数自身元素也不能够重复。
代码
#include<iostream> #include<algorithm> using namespace std; int main() { int q,b,c,sum=0,temp; cin >> q >> b >> c; for(int i=123;i<999;i++) { int a[10]={0},s=0; if(i/q*c>999) break; if(i%q!=0) continue; temp = i;//第一个数判断开始; for(int n=0;n<3;n++) { if(temp%10==0||a[temp%10]==1) { s=1; break; } a[temp%10]=1; temp = temp / 10; } if(s==1) continue; int j=i/q*b; temp = j;//第二个数判断开始; for(int n=0;n<3;n++) { if(a[temp%10]==0&&temp%10!=0) a[temp%10]=1; else { s=1; break; } temp = temp/10; } if(s==1) continue; int k=i/q*c; temp = k;//第三个数判断开始; for(int n=0;n<3;n++) { if(a[temp%10]==0 && temp%10!=0) a[temp%10]=1; else { s=1; break; } temp = temp/10; } if(s==1) continue; else { cout << i << " " << j << " " << k <<endl; sum++; } } if(sum==0) { cout << "no!!!" <<endl; } return 0; }