poj1426 Find The Multiple(c语言巧解)
Find The Multiple
Time Limit: 1000MS | Memory Limit: 10000K | |||
Total Submissions: 36335 | Accepted: 15194 | Special Judge |
Description
Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal representation contains only the digits 0 and 1. You may assume that n is not greater than 200 and there is a corresponding m containing no more than 100 decimal digits.
Input
The input file may contain multiple test cases. Each line contains a value of n (1 <= n <= 200). A line containing a zero terminates the input.
Output
For each value of n in the input print a line containing the corresponding value of m. The decimal representation of m must not contain more than 100 digits. If there are multiple solutions for a given value of n, any one of them is acceptable.
Sample Input
2 6 19 0
Sample Output
10 100100100100100100 111111111111111111
----------------------------------------------------------------------------------------------------------------------
关于我的想法
很多同学的算法是在结果不超过long long的取值范围的情况下得到的答案,而题目却说可能存在100位的数,明显大部分同学利用了这个题目的漏洞解出这个题目
下面我介绍一种每个输出都为100位数的方法,先用深度搜索,创建一个只含0和1的数组,再用check()函数检查这个数组是不是可以除尽n,可以则为结果
关于check()
将数组从99到0分别提取出来,再加上上一位残留的余数*10,模n,余数存起来留给下一位,直到0位的时候余数为0,也就是除尽了。
这个检查函数的原理与我们自己手写算一个数除以另一个数类似,最后一位除尽,表示这个数可以除尽。
#include <stdio.h> #include <stdlib.h> int len[110],n,bo; int check()//检查数组是否可以除尽 { int i,y=0; for(i=99;i>=0;i--) y=((len[i]+y)%n)*10; if(y==0)//余数为零 return 1; else return 0; } int dfs(int x) { int i; if(bo)return;//得到了结果 if(x<0)//到了数组的底 { if(check()) bo=1; return; } for(i=1;i>=0;i--)//从1到0计算更快,否则容易超时 { if(bo)return;//得到了结果 len[x]=i; dfs(x-1); } } int main() { int i; while(scanf("%d",&n)==1&&n) { bo=0; dfs(99); for(i=99;i>=0;i--) printf("%d",len[i]); printf("\n"); } return 0; }