三连击(升级版)

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值