循环最小的
a
a
a,用
A
:
B
:
C
A:B:C
A:B:C这个比例来表示
b
、
c
b、c
b、c
b
=
a
∗
B
/
A
b=a*B/A
b=a∗B/A
c
=
a
∗
C
/
A
c=a*C/A
c=a∗C/A
尽管我们知道:
b
=
a
∗
B
/
A
<
=
>
b
=
a
∗
(
B
/
A
)
b=a*B/A <=>b=a*(B/A)
b=a∗B/A<=>b=a∗(B/A)
但是不能这样写,因为如果
B
/
A
B/A
B/A并不是整型,那么一定会有精度损失!
比如:123*(8/3)和123*8/3是答案是不一样的,我们选择后一种方式!
然后分解
a
、
b
、
c
a、b、c
a、b、c的每一位,判断数字之和与之积是否满足
∑
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=1∑3ai+i=1∑3bi+i=1∑3ci==1∑9x
∏
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=1∏3ai+i=1∏3bi+i=1∏3ci==1∏9x
对于是否找到这样一组数,用
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