luogu_P1618

在这里插入图片描述
循环最小的 a a a,用 A : B : C A:B:C A:B:C这个比例来表示 b 、 c b、c bc
b = a ∗ B / A b=a*B/A b=aB/A
c = a ∗ C / A c=a*C/A c=aC/A
尽管我们知道: b = a ∗ B / A < = > b = a ∗ ( B / A ) b=a*B/A <=>b=a*(B/A) b=aB/A<=>b=a(B/A)
但是不能这样写,因为如果 B / A B/A B/A并不是整型,那么一定会有精度损失!
比如:123*(8/3)和123*8/3是答案是不一样的,我们选择后一种方式!
然后分解 a 、 b 、 c a、b、c abc的每一位,判断数字之和与之积是否满足
∑ i = 1 3 a i + ∑ i = 1 3 b i + ∑ i = 1 3 c i = = ∑ 1 9 x \sum_{i=1}^3a_i+\sum_{i=1}^3b_i+\sum_{i=1}^3c_i==\sum_{1}^{9} x i=13ai+i=13bi+i=13ci==19x
∏ i = 1 3 a i + ∏ i = 1 3 b i + ∏ i = 1 3 c i = = ∏ 1 9 x \prod_{i=1}^3a_i+\prod_{i=1}^3b_i+\prod_{i=1}^3c_i==\prod_{1}^{9} x i=13ai+i=13bi+i=13ci==19x
对于是否找到这样一组数,用 f l a g flag flag进行标记即可,当然也可以 c n t cnt cnt进行计数

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a,b,c;//三位数
	int A,B,C;//比例
	int cnt=0;//也可以用flag进行标记
	cin>>A>>B>>C;
	for(a=1;a<=987*A/C;a++)//不需用循环到最大的987
	{
		b=a*B/A;//一定不要写成b=a*(B/A) (B/A)非整数会精度损失!
		c=a*C/A;//同上注释
		if((b<=999)&&(c<=999)&&(a/100+a%10+a/10%10+b/100+b%10+b/10%10+c/100+c%10+c/10%10==45)
		&&(((a/100)*(a%10)*(a/10%10)*(b/100)*(b%10)*(b/10%10)*(c/100)*(c%10)*(c/10%10))==362880))//和积验证法(0~9)
		{
			cout<<a<<" "<<b<<" "<<c<<endl;
			cnt++;//flag标记也可以
		}
	}
	if(cnt==0){//找不到这组数
		cout<<"No!!!"<<endl;
	}
	return 0;
} 

运行结果

1 2 3
192 384 576
219 438 657
273 546 819
327 654 981

//B/A C/A不是整数的情况
3 7 8
213 497 568
321 749 856

123 456 789
123 456 789
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.zwX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值