40分

P1618 三连击(升级版)

Oscar111111 @ 2024-07-19 14:34:59

#include<bits/stdc++.h>
using namespace std;
int d[10];
bool is=false;
bool x(int a,int b,int c){
    int n;
    n=1;
    while(a){
        d[n]=a%10;
        a/=10;
        n++;
    }
    while(b){
        d[n]=b%10;
        b/=10;
        n++;
    }
    while(c){
        d[n]=c%10;
        c/=10;
        n++;
    }
    sort(d+1,d+10);
    for(int i=1;i<=9;i++)
        if(d[i]!=i) return false;
    return true;
}
int main()
{
    int a,b,c;
    cin>>a>>b>>c;
    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++){
            for(int k=1;k<=9;k++)
                if(x((i*100+j*10+k)*a,(i*100+j*10+k)*b,(i*100+j*10+k)*c)){
                    is=true;
                    cout<<i*100+j*10+k<<" "<<(i*100+j*10+k)*2<<" "<<(i*100+j*10+k)*3<<endl;
                }
        }
    }
    if(!is) cout<<"No!!!";
    return 0;
}

输出样例时有一个"No!!!"


by JackyLi @ 2024-07-25 14:49:07

@Oscar111111

#include<bits/stdc++.h>
using namespace std;
bool f[100],numf[11000];
bool ntsd(int a,int b,int c){//不同数位(Not the same digits)+大小+是否重复的判断 
    if(a<100||b<100||c<100||a>999||b>999||c>999||!numf[a]||!numf[b]||!numf[c]) return false;
    memset(f,true,sizeof(f));
    //a
    while(a!=0){
        int tmp=a%10;
        if(f[tmp]==true&&tmp!=0){
            f[tmp]=false;
        }
        else{
            return false;
        }
        a/=10;
    }
    //b
    while(b!=0){
        int tmp=b%10;
        if(f[tmp]&&tmp!=0){
            f[tmp]=false;
        }
        else{
            return false;
        }
        b/=10;
    }
    //c
    while(c!=0){
        int tmp=c%10;
        if(f[tmp]&&tmp!=0){
            f[tmp]=false;
        }
        else{
            return false;
        }
        c/=10;
    }
    numf[a]=false;
    numf[b]=false;
    numf[c]=false;
    return true;
}
int main()
{
    memset(numf,true,sizeof(numf));
    int a,b,c;
    bool f=true;
    cin>>a>>b>>c;
    if(a==0||b==0||c==0){//特判 
        cout<<"No!!!";
        return 0; 
    }
    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++){
            for(int k=1;k<=9;k++){
                //遍历出每一个数 
                int num=i*100+j*10+k;//每个数字 
                if(num%a==0&&ntsd(num,num/a*b,num/a*c)){//按比分配+ 不同数位(Not the same digits)+大小+是否重复的判断 
                    f=false;//打标记 
                    cout<<num<<" "<<num/a*b<<" "<<num/a*c<<endl;//输出 
                }
            }
        }
    }
    if(f) cout<<"No!!!";//如果没有符合的就输出“No!!!” 
    return 0;
}

by JackyLi @ 2024-07-25 14:58:52

@Oscar111111 应该这样写就能AC了,记得不要光抄,要理解代码,我特意把注释写上了。有不懂的记得问我。


by JackyLi @ 2024-07-25 15:04:26

备注:我改了好久


by Oscar111111 @ 2024-08-03 11:38:38

我还没AC呢


|