洛谷 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 }

最终代码  ☝ ☝ ☝ ㊤ ㊤ ㊤ ↑ ↑ ↑

        

 

posted @ 2020-02-02 16:01  zkw666  阅读(152)  评论(0编辑  收藏  举报