player-none 发表于 2025-4-19 12:34:31

连比数

题目描述

将 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;
}

FishC 发表于 2025-4-19 12:39:11

解答

首先将输入的三个数约分为最简整数比,然后遍历可能的倍数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]
查看完整版本: 连比数