题意:给出一个整数n在1到200之间,要求找到它的一个倍数仅由0和1组成,长度在200以内。
不要被长度吓死(づ ̄ 3 ̄)づ,unsigned __int64 ( 0~18446744073709551615)就可以存下来结果。
这样可以用DFS,从1开始,每次枚举m*10和m*10+1,一直向下搜索。如果遇到结果的,就直接输出,标记found后再返回。
注意:unsigned __int64 只能存储20位数,因此我们只能搜到第19层,在19层时一定要返回。否则会像我一样悲剧~
AC代码(比较丑,忍一下(*  ̄3)(ε ̄ *))
#include <iostream>
#include <cstdio>
using namespace std;
int n,found;
void dfs(unsigned __int64 x,int n,int lay)
{
if(found) return;
if(x%n==0)
{
printf("%I64u\n",x);
found=1;
return;
}
if(lay==19) return;
dfs(x*10,n,lay+1);
dfs(x*10+1,n,lay+1);
}
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
found=0;
dfs(1,n,0); //第一个参数代表从1开始查找,第三个代表深搜的层数。
}
return 0;
}