UVa725

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 15;
int vis[maxn];

int check(int n, int x)
{
    memset(vis, 0, sizeof(vis));
    int a, t;
    t = n / x;
    if(t < 10000) vis[0] = 1;    //这步极为关键,刚开始没有这步,测试样例都过不了
                                //找了半天才发现。其实,如果出现前导0,一定是在
                                //分母,不可能出现在分子。
    while(n)
    {
        a = n % 10;                //标记整数的每一位数字。
        vis[a] = 1;
        n /= 10;
    }
    while(t)
    {
        a = t % 10;
        vis[a] = 1;
        t /= 10;
    }
    for(int i = 0; i < 10; i++)
    {
        if(!vis[i]) return 0; // 当有一个没有标记时,直接返回0,说明不符合条件。
    }
    return 1;
}
int main()
{
    int n, flag, kase = 0;
    while(~scanf("%d", &n) && n)
    {
        flag = 0;
        if(kase++) printf("
");    //刚开始这行写在下面注释的地方《1》,WA了一发,表示很迷茫
                                    //因为并没有提示PE,注意UVa的风格,这种题一定要小心,只是在
                                    //两行中间取空行,而第一行之前和最后一行之后是没有空行的,此处
                                    //与HDU是有点区别的。
        for(int i = 10000; i <= 99999; i++)
        {
            int t = i % n;
            //int k = i / n;
            if(t == 0 && check(i, n))    //整除并且包含0 ~ 9,则输出
            {
                flag = 1;
                printf("%05d / %05d = %d
", i,  i/n, n); //有前导0,则用%05d的方式,左边一个可以不用。
            }
        }
        //if(kase++) printf("
"); 《1》
        if(!flag) printf("There are no solutions for %d.
", n); //之前没有符合条件的,则输出这一行。
        //printf("
");    //注释掉了前面跟kase有关的一行代码,WA了一发。
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/loveprincess/p/4788382.html