题意:
就是给你几组测试数据,一个n代表一个,让你寻找n的倍数只含0 1,输出其中任意一个即可!
思路:
采用搜索的方法,如果搜索到m则退出,否则搜索m*10和m*10+1这两种路径!!
细节:
使用int ,long long int 会爆,需要使用unsigned long long来进行存储,还有就是,一开始不知道到底要搜到多少位是才return,看了题解。。。19位!!!!
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int flag;
int dfs(unsigned long long t,int n,int k)
{
if(flag==1)//如果发现答案,结束搜索
return 0;
if(t%n==0)
{
cout<<t<<endl;//发现答案,输出来!!
flag=1;
return 0;
}
if(k==19)//到19呈回溯
return 0 ;
dfs(t*10,n,k+1);
dfs(t*10+1,n,k+1);
}
int main()
{
int n;
while(cin>>n&&n)
{
flag=0;
dfs(1,n,0);
}
return 0;
}
另一种思路:(感觉很简单,没接触过)哈夫曼思想
代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
long long mod[600001];
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
int i;
for(i=1;;i++)
{
mod[i]=mod[i/2]*10+i%2;
// x=(x/10)%n*10+i%2;
// mod[i]表示十进制里长成二进制i这样的数
if(mod[i]%n==0)
{
break;
}
}
printf("%I64d\n",mod[i]);
}
return 0;
}