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); } ; }