连比数
题目描述将 1,2,…,9共 9个数分成 3 组,分别组成 3个三位数,输入比值a、b、c,使这 3个三位数构成a:b:c的比例,试求出所有满足条件的3个三位数。若不存在该比值,则输出No!!!(注意: "No!!!" 一个字符都不能差)
输入描述
一行,包含3个整数,a、b、c。代表三个数的比值。
输出描述
若干行,每行3个数字。按照每行第1个数字升序排列。
样例1
输入
1 2 3
输出
192 384 576
219 438 657
273 546 819
327 654 981
提示
保证 a<b<c。
#include<bits/stdc++.h>
using namespace std;
bool isduplicate(int a, int b, int c){
string s=to_string(a)+to_string(b)+to_string(c);
sort(s.begin(),s.end());
return s!="123456789";
}
int main(){
int a,b,c;
cin>>a>>b>>c;
bool flag=0;
for(int i=1;i<=9;i++){
for(int j=1;j<=9;++j){
if(i==j)continue;
for(int k=1;k<=9;++k){
if(k==i||k==j)continue;
int n1=i*100+j*10+k;
float n2=(n1*1.0/a*b);
float n3=(n1*1.0/a*c);
if(n2-ceil(n2)||n3-floor(n3))continue;
if(n2>999||n3>999)continue;
if(isduplicate(n1,n2,n3))continue;
cout<<n1<<" "<<n2<<" "<<n3<<endl;
flag=1;
}
}
}
if(!flag){
cout<<"No!!!";
}
return 0;
} 解答
首先将输入的三个数约分为最简整数比,然后遍历可能的倍数k,生成对应的三个三位数,并检查这些数是否满足条件。
import math
a, b, c = map(int, input().split())
# 检查输入合法性
if a <= 0 or b <= 0 or c <= 0:
print("No!!!")
exit()
# 约分为最简整数比
d = math.gcd(math.gcd(a, b), c)
a1, b1, c1 = a // d, b // d, c // d
# 检查约分后的数是否合法
if a1 <= 0 or b1 <= 0 or c1 <= 0:
print("No!!!")
exit()
# 计算k的合法范围
min_k = max((100 + a1 - 1) // a1, (100 + b1 - 1) // b1, (100 + c1 - 1) // c1)
max_k = min(999 // a1, 999 // b1, 999 // c1)
if min_k > max_k:
print("No!!!")
exit()
solutions = []
for k in range(min_k, max_k + 1):
x = a1 * k
y = b1 * k
z = c1 * k
nums = f"{x}{y}{z}"
# 检查数字是否合法
if len(nums) != 9 or '0' in nums or len(set(nums)) != 9:
continue
solutions.append((x, y, z))
# 输出结果
if not solutions:
print("No!!!")
else:
for sol in sorted(solutions):
print(f"{sol} {sol} {sol}")
关键思路:
1. 将输入比例约分为最简形式。
2. 计算可能的倍数范围,使三个数均为三位数。
3. 遍历所有可能的倍数,生成对应的三个数。
4. 检查这些数是否满足数字不重复且包含1-9的条件。
5. 按格式输出结果或"No!!!"。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]