Uva 725 Division

时间:2023-03-09 07:15:54
Uva 725 Division

0.不要傻傻的用递归去构造出一个五位数来,直接for循环最小到最大就好,可以稍微剪枝一丢丢,因为最小的数是01234 从1234开始,因为倍数n最小为2 而分子是一个最多五位数,所以分母应该小于五万。 所以for 1234 到50000-1就行了。哦还有个同理,fenmu*n>=十万的可以直接扔掉了

1.还有个判断重复的时候直接这样就好了

while(i)
    {
            num[i%]=;
            i/=;
    }
    while(j)
    {
            num[j%]=;
            j/=;
    }
    ;i<;i++)
        num[]+=num[i];
    ]==)
    {
        printf("%d / %05d = %d\n",fenzi,fenmu,n);
        ok=true;
    }

2.别忘了  当分子小于一万的时候 记得num[0]=1  0是被用掉的这时候

3.!!!scanf控制格式的时候 真的 真的 真的 很好用  %nd (n是一个数字)  就代表着输出%d那个数字 然后不足n位 从左边开始用空格补全   %0nd 就代表着输出%d那个 数字 然后不足n位 从左边开始用0补全

 #include <cstdio>
 #include <cstring>
 int n;
 bool ok;
 ];
 void solve(int i,int j)
 {
     int fenmu=i,fenzi=j;
     ) num[]=;
     while(i)
     {
             num[i%]=;
             i/=;
     }
     while(j)
     {
             num[j%]=;
             j/=;
     }
     ;i<;i++)
         num[]+=num[i];
     ]==)
     {
         printf("%d / %05d = %d\n",fenzi,fenmu,n);
         ok=true;
     }
 }
 int main()
 {
     ;
     while(~scanf("%d",&n))
     {
         ) break;
         if(flag) printf("\n");
         flag=;

         ok=false;
         ;i<;i++)
         {
             memset(num,,sizeof(num));
             int j=i*n;
             ) continue;
             solve(i,j);
         }
         if(!ok) printf("There are no solutions for %d.\n",n);
     }
     ;
 }