救救我!!

P1618 三连击(升级版)

Linco2012 @ 2024-11-22 16:59:39

#include<iostream>
#include<cmath>
#include<ctime>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
#include<list>
#include<stack>
#include<queue>
#include<cstdio>
using namespace std;
int x[11];
void get(int k)
{
    x[k/100]=1;
    x[k/10%10]=1;
    x[k%10]=1;
}
bool cheak(int a,int b,int c)
{
    memset(x,0,sizeof(x));
    if(b>999||c>999)    return 0;
    get(a);
    get(b);
    get(c);
    if(x[1]==1&&x[2]==1&&x[3]==1&&x[4]==1&&x[5]==1&&x[6]==1&&x[7]==1&&x[8]==1&&x[9]==1) return 1;
    return 0;
}
int main()
{
    long long a,b,c;
    bool f=1;
    cin>>a>>b>>c;
    for(long long x=123;x<=987;x++)
    {
        if(x%a==0)
        {
            long long y=(x/a)*b;
            long long l=(x/a)*c;
            if(cheak(x,y,l))
            {
                f=0;
                cout<<x<<" "<<y<<" "<<l<<endl; 
            } 
        }
    }
    if(f)    cout<<"No!!!";
    return 0;
}

by laotingrui @ 2024-11-23 19:39:10

@Linco2012 \ 看看我的 求关~~

#include<iostream>
#include<cstring>
using namespace std;
int t[10],a,b,c;
bool p;
//用于标记用过的数
void cfsw(int x){
    while(x!=0){
        t[x%10]++;
        x/=10;
    }
}
int main(){
    scanf("%d%d%d",&a,&b,&c);
    for(int i=1;i<=999;i++){
        int x=i*a,y=i*b,z=i*c,num=0;
        if(y>999||z>999) break;//不是三位数,退出循环
        cfsw(x),cfsw(y),cfsw(z);//标记
        bool flag=1;
        for(int i=1;i<=9;i++)
            if(t[i]!=1){
                flag=0;
                break;
            }//判断每个数是否只用了一次,用flag标记
        if(flag){
            printf("%d %d %d\n",x,y,z);
            p=1;
        }//满足条件,输出并标记
        memset(t,0,sizeof(t));//清空数组
    }
    if(!p) printf("No!!!");//没标记过,输出"No!!!"
    return 0;
}

|