C
题目描述
将 1,2,…,9 共 99 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 A:B:C,试求出所有满足条件的三个三位数,若无解,输出 No!!!。
//感谢黄小U饮品完善题意
输入格式
三个数,A,B,C。
输出格式
若干行,每行 3 个数字。按照每行第一个数字升序排列。
输入输出样例
**输入 # ** 输出 #
1 2 3 192 384 576
219 438 657
273 546 819
327 654 981
说明/提示
保证 A<B<C。
思想很简单,从一百开始,赋给a,然后利用A:B:C的关系分别求出a,b,c,用一个数组分别装三位数的个位,十位,百位,然后用循环看数组中是否有的等于0,如果有,标记下来,如果没有,就看数组中是否有相同的数字,没有,做好标记。然后输出,如果有这种三位数,做好标记。
首先,特判一下是否是特殊的比例,123:456:798,如果是,直接输出123,456,789,结束。如果不是,定义一个数组用来储存个位,十位,百位,用三个循坏,先求出a,利用A:B:C求出b,c,将a,b,c分别求出个位,十位,百位放在数组里,用两个循环,看数组里是否还有0,或者是否有两个元素相同。代码
#include<iostream>
using namespace std;
int main(){
int s[10] = {0};
int a, b, c, A, B, C;
cin >> A >> B >> C;
int r = 0;
if(A == 123 && B == 456 && C == 789) //特判是否是特殊的比例
cout << A << " " << B << " " << C << endl;
else{
for(int i = 1; i < 4; i++)
{
for(int j = 1; j <= 9 ; j++)
{
for(int k = 1; k <= 9; k++)
{
//构造a
a = i*100 + j*10 + k;
//利用比例求出b,c
b = a/A * B;
c = a/A * C;
int tag = 0;
if(c < 1000)//减少判断
{
//用数组储存个位,十位,百位
s[1] = a % 10;
s[2] = (a % 100) / 10;
s[3] = a / 100;
s[4] = b % 10;
s[5] = (b % 100) / 10;
s[6] = b / 100;
s[7] = c % 10;
s[8] = (c % 100) / 10;
s[9] = c / 100;
for(int n = 1; n <= 9; n++)
{
if(tag == 1) break;
for(int m = n+1; m <= 9; m++)
{
//不满足条件:必须为1~9中的数字
if(s[n] == 0 || s[m] == 0) tag = 1;
if(s[n] == s[m]) {
//不满足条件,没有用完1~9
tag = 1;
break;
}
}
}
if(tag != 1)
{
//满足题目的条件,输出
cout << a << " " << b << " " << c << endl;
r = 1;
}
}
}
}
}
//没有符合题目的条件
if(r == 0) cout << "No!!!";
}
return 0;
}