UVa725 - Division

时间:2023-03-09 08:01:20
UVa725 - Division
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = ;
int vis[maxn]; int check(int n, int x)
{
memset(vis, , sizeof(vis));
int a, t;
t = n / x;
if(t < ) vis[] = ; //这步极为关键,刚开始没有这步,测试样例都过不了
//找了半天才发现。其实,如果出现前导0,一定是在
//分母,不可能出现在分子。
while(n)
{
a = n % ; //标记整数的每一位数字。
vis[a] = ;
n /= ;
}
while(t)
{
a = t % ;
vis[a] = ;
t /= ;
}
for(int i = ; i < ; i++)
{
if(!vis[i]) return ; // 当有一个没有标记时,直接返回0,说明不符合条件。
}
return ;
}
int main()
{
int n, flag, kase = ;
while(~scanf("%d", &n) && n)
{
flag = ;
if(kase++) printf("\n"); //刚开始这行写在下面注释的地方《1》,WA了一发,表示很迷茫
//因为并没有提示PE,注意UVa的风格,这种题一定要小心,只是在
//两行中间取空行,而第一行之前和最后一行之后是没有空行的,此处
//与HDU是有点区别的。
for(int i = ; i <= ; i++)
{
int t = i % n;
//int k = i / n;
if(t == && check(i, n)) //整除并且包含0 ~ 9,则输出
{
flag = ;
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 ;
}