UVa725 - Division
#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("\n"); //刚开始这行写在下面注释的地方《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\n", i, i/n, n); //有前导0,则用%05d的方式,左边一个可以不用。 } } //if(kase++) printf("\n"); 《1》 if(!flag) printf("There are no solutions for %d.\n", n); //之前没有符合条件的,则输出这一行。 //printf("\n"); //注释掉了前面跟kase有关的一行代码,WA了一发。 } return 0; }