洛谷P1618 三连击(升级版)

这个题目可是有意思的很,大致意思如下

:给出一到九排成三个三位数,然后满足A:B:C的比值,也就是说这三个三位数中都必须遍历1到9才可以,并且是升序排列,那怎么做呢?

我先给出最开始的思路(失败)

:给定二维数组甚至三维数组(拿输出阳历来看无非是一个长度为4的数组里面每个数组元素又包括三个小数组)

当然,写了半天我选择放弃,根本写不出来;

于是就有了一个很有趣的解法:

从100到999开始遍历(123~987也可),如果满足这个数取余A是0的话,就让其余两个数等于i/A*B和i/A*C(i代表这个数)

然后在满足其余两个数都在题目条件之内中,定义了九个数组用来存放这三个百位数的各个数字,然后,精彩一幕来了,

为了确保这三个百位数都可以遍历1到9,我们就采取这九个数组的和与这九个数组的乘积等于1~9的和与9!;

然后输出满足条件的i,j,k就可以了

附上代码

#include<bits/stdc++.h>
    using namespace std;
    int a,b,c,flag=0;
    int j,k;
    int main()
    {
        scanf("%d%d%d",&a,&b,&c);
        for(int i=100;i<=999;i++)
        {
            if(i%a==0)
            {
            j=i/a*b;
            k=i/a*c;
            if(j>=100&&j<=999&&k>=100&&k<=999)
            {
                int l[10],sum=0,xx=1;
                l[1]=i/100;
                l[2]=i/10%10;
                l[3]=i%10;
                l[4]=j/100;
                l[5]=j/10%10;
                l[6]=j%10;
                l[7]=k/100;
                l[8]=k/10%10;
                l[9]=k%10;
                for(int _i=1;_i<=9;_i++)
                {
                    sum+=l[_i];
                    xx*=l[_i];
                }
                if(sum==45&&xx==362880)
                {
                    flag=1;
                    printf("%d %d %d\n",i,j,k);
                }
            }
        }
    }
        if(flag==0)printf("No!!!");
        return 0;
    }

 

上一篇:一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析


下一篇:Html+Css+Js(for 结构语句)1-100 之间所有数、打印 9*9 乘法表。