洛谷P1008三连击:

新手村这道题实在是太不友好了。。。

看了题解,归纳出来:

题解思路:用循环枚举出最小数,然后分别乘以2和3得到第二、三个数。再验证其三位能组成1——9.能则输出。

破题点:

1.最小数的取值从理论上来说应是123——333

2.逆向思考,先令其满足1:2:3再验证其刚好由1~9组成

3.如何验证其由1~9组成

题目:

1,2,…,99个数分成3组,分别组成3个三位数,且使这3个三位数构成1:2:3的比例,试求出所有满足条件的3个三位数

我的解法:

//定义一个数组,判断这组数是否出现1~9一次且仅一次。
#include
using namespace std;
int main(){
    int i,a,b,j;
    for(i=123;i<333;i++){
        int m[11]={0};//用于判断的数组
        int sum=0;
        a=2*i;
        b=3*i;
        m[i/100]=1;//以下将所有出现的数字记录
        m[i/10%10]=1;
        m[i%10]=1;
        m[a/100]=1;
        m[a/10%10]=1;
        m[a%10]=1;
        m[b/100]=1;
        m[b/10%10]=1;
        m[b%10]=1;
        for(j=1;j<10;j++)
            sum+=m[j];
        if(9==sum)//验证这组数是否出现1~9一次且仅一次
            cout<

()

题解第一位的大佬用的是“两个集合,其元素之积、元素之和都分别相等,则两个集合完全相同”的数学思想。(反正我是不明白为啥。。。tqltql)大佬数学思想部分:

if((a/100+a/10%10+a%10+b/100+b/10%10+b%10+c/100+c/10%10+c%10==1+2+3+4+5+6+7+8+9)&&((a/100)*(a/10%10)*(a%10)*(b/100)*(b/10%10)*(b%10)*(c/100)*(c/10%10)*(c%10)==(1)*(2)*(3)*(4)*(5)*(6)*(7)*(8)*(9)))
                    printf("%d %d %d\n",a,b,c);

 

你可能感兴趣的:(C++,洛谷)