鱼C论坛

 找回密码
 立即注册
查看: 79|回复: 1

[技术交流] 连比数

[复制链接]
发表于 2025-4-19 12:34:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目描述

将 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。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. bool isduplicate(int a, int b, int c){
  4.     string s=to_string(a)+to_string(b)+to_string(c);
  5.     sort(s.begin(),s.end());
  6.     return s!="123456789";
  7. }
  8. int main(){
  9.     int a,b,c;
  10.     cin>>a>>b>>c;
  11.     bool flag=0;
  12.     for(int i=1;i<=9;i++){
  13.         for(int j=1;j<=9;++j){
  14.             if(i==j)continue;
  15.             for(int k=1;k<=9;++k){
  16.                 if(k==i||k==j)continue;
  17.                 int n1=i*100+j*10+k;
  18.                 float n2=(n1*1.0/a*b);
  19.                 float n3=(n1*1.0/a*c);
  20.                 if(n2-ceil(n2)||n3-floor(n3))continue;
  21.                 if(n2>999||n3>999)continue;
  22.                 if(isduplicate(n1,n2,n3))continue;
  23.                 cout<<n1<<" "<<n2<<" "<<n3<<endl;
  24.                 flag=1;
  25.             }
  26.         }
  27.     }
  28.     if(!flag){
  29.         cout<<"No!!!";
  30.     }
  31.     return 0;
  32. }
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-4-19 12:39:11 | 显示全部楼层
解答

首先将输入的三个数约分为最简整数比,然后遍历可能的倍数k,生成对应的三个三位数,并检查这些数是否满足条件。


  1. import math

  2. a, b, c = map(int, input().split())

  3. # 检查输入合法性
  4. if a <= 0 or b <= 0 or c <= 0:
  5.     print("No!!!")
  6.     exit()

  7. # 约分为最简整数比
  8. d = math.gcd(math.gcd(a, b), c)
  9. a1, b1, c1 = a // d, b // d, c // d

  10. # 检查约分后的数是否合法
  11. if a1 <= 0 or b1 <= 0 or c1 <= 0:
  12.     print("No!!!")
  13.     exit()

  14. # 计算k的合法范围
  15. min_k = max((100 + a1 - 1) // a1, (100 + b1 - 1) // b1, (100 + c1 - 1) // c1)
  16. max_k = min(999 // a1, 999 // b1, 999 // c1)

  17. if min_k > max_k:
  18.     print("No!!!")
  19.     exit()

  20. solutions = []
  21. for k in range(min_k, max_k + 1):
  22.     x = a1 * k
  23.     y = b1 * k
  24.     z = c1 * k
  25.     nums = f"{x}{y}{z}"
  26.    
  27.     # 检查数字是否合法
  28.     if len(nums) != 9 or '0' in nums or len(set(nums)) != 9:
  29.         continue
  30.     solutions.append((x, y, z))

  31. # 输出结果
  32. if not solutions:
  33.     print("No!!!")
  34. else:
  35.     for sol in sorted(solutions):
  36.         print(f"{sol[0]} {sol[1]} {sol[2]}")
复制代码


关键思路:
1. 将输入比例约分为最简形式。
2. 计算可能的倍数范围,使三个数均为三位数。
3. 遍历所有可能的倍数,生成对应的三个数。
4. 检查这些数是否满足数字不重复且包含1-9的条件。
5. 按格式输出结果或"No!!!"。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-10 03:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表