POJ 1462

来源:互联网 发布:域名生成算法 编辑:程序博客网 时间:2024/05/23 14:04

题意:给出一个整数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;}








0 0