c语言巧解,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 #include

int len[110],n,bo;intcheck()//检查数组是否可以除尽

{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(intx)

{inti;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);

}

}intmain()

{inti;while(scanf("%d",&n)==1&&n)

{

bo=0;

dfs(99);for(i=99;i>=0;i--)

printf("%d",len[i]);

printf("\n");

}return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值