14 条题解

  • 0
    @ 2024-9-15 7:41:37

    B1题解

    题目:

    将1,2,…,9共9个数分成三组,分别组成三个三位数;
    且使这三个三位数构成1:2:3的比例;
    试求出所有满足条件的三个三位数。
    例如:三个三位数:
    192、384、576
    满足以上条件。
    

    相信大家跟我一样,读完题先是一愣

    当然,由于我是看到了1:2:3的比例; 所以先想到的就是用for循环

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        for(int i=100;i<=999;i++){
            /*
            这里呢,就是判断一下,是否可以构成1:2:3
            So,只需要这样输出:
            */
            cout<<i<<" "<<i*2<<" "<<i*3<<endl;
        }
        return 0;
    }
    

    然后遇到了问题~~

    哈哈,直接不对!!!

    emm..那就再看看,因为for循环中要用到i*3,所以 我们可以直接让i<=333,但只要仔细一读题,你会发现 题目中的第二的条件:

    用1-9这9个数!!

    有种被骗了的感觉

    ok,所以我们还要排除0 这是个伟大的难点 所以我们可以这样做:

    1. 让for循环的i 初始值为 111 纯粹较少时间,不改也行,好像没有大问题

    2. 也可以将i和i * 2,i * 3这几个数的每一位判断是不是0

    因为给了是个三位数所以

    1. 百位:i/100
    2. 十位:i/10%10
    3. 个位:i%10

    所以得到以下代码:

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        int one,two,three;
        for(int i=111;i<=333;i++){
            one=i;
            two=i*2;
            three=i*3;
            if((one/100)!=0 && (one/10%10)!=0 && (one%10)!=0){
                if((two/100)!=0 && (two/10%10)!=0 && (two%10)!=0){
                    if((three/100)!=0 && (three/10%10)!=0 && (three%10)!=0){
                        cout<<one<<" "<<two<<" "<<three<<endl;
                    }
                }
            }
        }
        return 0;
    }
    

    感觉良好,但是

    过不了,哈哈

    emmmm.... 所以我们再次读题,发现是每个数只能用一次

    这就好做了,只要判断每个数位乘起来是不是9!

    和加起来是不是45(从1+到9)

    所以得到以下代码:

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        int one,two,three;
        for(int i=111;i<=333;i++){
            one=i;
            two=i*2;
            three=i*3;
            if((one/100)!=0 && (one/10%10)!=0 && (one%10)!=0){
                if((two/100)!=0 && (two/10%10)!=0 && (two%10)!=0){
                    if((three/100)!=0 && (three/10%10)!=0 && (three%10)!=0){
                        if((one/100) * (one/10%10) * (one%10) * (two/100) * (two/10%10) * (two%10) * (three/100) * (three/10%10) * (three%10) == 1*2*3*4*5*6*7*8*9){
                            if((one/100) + (one/10%10) + (one%10) + (two/100) + (two/10%10) + (two%10) + (three/100) + (three/10%10) + (three%10) == 45){
                                cout<<one<<" "<<two<<" "<<three<<endl;
                            }
                        }
                    }
                }
            }
        }
        return 0;
    }
    

    你以为结束了??

    不可能!!!绝对不可能!!!

    这样虽然能过,可是大家有没有想过一个问题:

    既然我们都已判断了三个数每个数的数位相加和相乘 那还有没有必要判断0呢???

    对,没有必要

    1.相乘,如有0,就是0 2.相加如果有,那么就会小于45吧!! 所以

    删了吧!!

    最后的代码如下

    Code

    #include <bits/stdc++.h>
    using namespace std;
    int main(){
        int one, two, three;
        for (int i = 111; i <= 333; i++){
            one = i;
            two = i * 2;
            three = i * 3;
            if ((one / 100) * (one / 10 % 10) * (one % 10) * (two / 100) * (two / 10 % 10) * (two % 10) * (three / 100) * (three / 10 % 10) * (three % 10) == 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9){
                if ((one / 100) + (one / 10 % 10) + (one % 10) + (two / 100) + (two / 10 % 10) + (two % 10) + (three / 100) + (three / 10 % 10) + (three % 10) == 45){
                    cout << one << " " << two << " " << three << endl;
                }
            }
        }
        return 0;
    }
    

    最后完结撒花,开心

    热知识

    这个题目,有点... emmmmm..

    信息

    ID
    32
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    329
    已通过
    176
    上传者