题解:P13185 [GCJ 2016 Qualification] Counting Sheep

· · 题解

题目大意:

枚举 N 的倍数, 直到全部十个数字都出现过为止。

思路:

显然,只有当 N0 时,输出 INSOMNIA

定义函数 \operatorname{digit} 将每个 N 的倍数进行拆分,并存入数组。

bool num[10];
void digit(long long x){
    while(x>0){
        num[x%10]=true;
        x/=10;
    }
}

定义函数 \operatorname{judge} 进行判断。

bool num[10];
bool judge(){
    for(int i=0;i<10;i++){
        if(!num[i]){
            return false;
        }
    }
    return true;
}

代码:

#include <bits/stdc++.h>
using namespace std;
bool num[10];
bool judge(){ // 判断是否全部出现。
    for(int i=0;i<10;i++){
        if(!num[i]){
            return false;
        }
    }
    return true;
}

void digit(long long x){ // 拆分数字。
    while(x>0){
        num[x%10]=true;
        x/=10;
    }
}

int main(){
    int T;
    scanf("%d",&T);
    for(int i=1;i<=T;i++){
        memset(num,0,sizeof(num)); // 清空。
        int n;
        long long cnt;
        scanf("%d",&n);
        if(n==0){ // 特判。
            printf("Case #%d: INSOMNIA\n",i);
            continue;
        }
        cnt=n;
        for(int j=1;;j++){
            digit(cnt*j);
            if(judge()){
                printf("Case #%d: %d\n",i,cnt*j);
                break;
            }
        }
    }
    return 0;
}