题解【洛谷P1618】 三连击(升级版)

设三个数分别为n1、n2、n3,因为三个数的比为A:B:C,取一份量i,使得A·i=x,B·i=y,C·i=z(·是*的意思)。

所以我们的代码只需要枚举i,并以此判断n1、n2、n3是否为三位数且包含1-9这九个数字即可。

判断是否包含1-9可以用p数组记录每个数字是否出现过,1为出现,0为没出现。

于是我们有了下列代码:

#include<bits/stdc++.h>
using namespace std;
int p[11];//记录是否包含1-9
void cf(int x){//分解出这个数的各个数位
    while(x>0){//如果这个数还有数位
        p[x%10]=1;//记录这个数位
        x/=10;//除以十,记录下一数位
    }
}
int a,b,c,n1,n2,n3,m,i,j,k,l;
int main()
{   k=0;//判断有没有解
    scanf("%d%d%d",&a,&b,&c);//输入比例
    for(i=1;i<=999;i++){//枚举i
        memset(p,0,sizeof(p));//p数组清零
        r=1;//判断变量
        n1=i*a;
        n2=i*b;
        n3=i*c;//计算三个数
        if(n1<100 || n2<100 || n3<100 || n1>999 || n2>999 || n3>999)break;//如果不是三位数就退出循环
        cf(n1);cf(n2);cf(n3);//依次拆分各个数字
        for(j=1;j<=9;j++){//是否1-9这九个数字都有
            if(p[j]==0)r=0;//如果没有,判断变量值记为0
        }
        if(r==1){//如果这三个数有解
            k=1;//判断有没有解的变量值记为1
            printf("%d %d %d\n",n1,n2,n3);//输出各个数
        }
    }
    if(k==0)printf("No!!!");//如果1个解都没有,则输出“No!!!”
    return 0;//结束
}

 

posted @ 2019-02-21 19:26  csxsi  阅读(285)  评论(0编辑  收藏  举报