洛谷 P1008 三连击
用1,2,……,9组成的三位数,已得知最小数为123;最大为987。因为组成的三个三位数要满足1:2:3的关系,若987占其中3份,
则一份为987/3,也就是329。所以,用for循环的话,只用定义i(占一份的数)从123到329循环。(若i>329,则占三份的数3i>987,不符合题意)
我的先将三个数定义为 i,2i,3i。这样就先满足了三个数的比例关系。我之后就没什么好办法,让i从123到329循环一次,定义一个一维数组,分别存储每组数据中每个数各个数位上的数。
再判断各个数位上的数相加是否为45(1+2+3+......+9),这样也有很多例外,所以我又判断了一次各个数位相乘是否为1*2*3*......*9的值,若两项都符合,则输出。
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int a,b,c,x[10],s=0,d=1; 6 for(int i=123;i<=329;++i) 7 { 8 a=i; 9 b=2*i; 10 c=3*i; 11 x[1]=a%10; 12 x[2]=a/10%10; 13 x[3]=a/100; 14 x[4]=b%10; 15 x[5]=b/10%10; 16 x[6]=b/100; 17 x[7]=c%10; 18 x[8]=c/10%10; 19 x[9]=c/100; 20 for(int j=1;j<=9;++j) 21 { 22 s+=x[j]; 23 d*=x[j]; 24 } 25 if(s==45 && d==1*2*3*4*5*6*7*8*9){ 26 cout<<a<<" "<<b<<" "<<c<<endl;} 27 s=0; 28 d=1; 29 } 30 return 0; 31 }
最终代码 ☝ ☝ ☝ ㊤ ㊤ ㊤ ↑ ↑ ↑