一、DFS
可以去判断这个数模n的余数,如果为0,则返回,如果不为0,则有两种情况,往这个数后面加0或者加1.然后只需要判断它的长度与题目规定的100之间的关系即可
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
bool flag;
char s[1005];
void dfs(int mod,int d,int n)
{
if(d>100) return ;
if(mod==0)
{
flag=true;
s[d]=0;
return ;
}
if(!flag)
{
s[d]='0';
dfs((mod*10)%n,d+1,n);
}
if(!flag)
{
s[d]='1';
dfs((mod*10+1)%n,d+1,n);
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
memset(s,0,sizeof(0));
s[0]='1';
flag=false;
dfs(1,1,n);
printf("%s\n",s);
}
return 0;
}
二、
寻找能整除N的,由0,1组成的数。本题采用DFS,虽然题目要求最后的结果可能在100digits。但是实际情况下,在unsigned long long 范围内完全可以找到相应的答案。
采用 unsigned long long 的版本:
#include <cstdlib>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <string>
#include <algorithm>
using namespace std;
unsigned long long answer;
int dfs(unsigned long long prenum,unsigned long long lev,int n)
{
if(prenum>=lev)
return 0;
if(lev%n==0)
{answer=lev;return 1;}
if(dfs(lev,lev*10,n))
{return 1;}
return dfs(lev,lev*10+1,n);
}
int main(int argc, char *argv[])
{
int n;
int i,j,k;
while(scanf("%d",&n)!=EOF)
{
if(!n)
break;
if(dfs(0,1,n))
cout<<answer<<endl;
}
// system("PAUSE");
return EXIT_SUCCESS;
}
数学https://www.2cto.com/kf/201410/340452.html
霍夫曼
#include<iostream>
using namespace std;
int mod[1048578];
int main(){
int n,m,pm;
while(cin>>n,n){
mod[1]=1%n;
m=10%n;
int i;
for(i=2;mod[i-1];i++){
mod[i]=(mod[i/2]*m+i%2)%n;
}
i--;
pm=1;
while(i){
mod[pm++]=i%2;
i/=2;
}
while(--pm) cout<<mod[pm];
cout<<endl;
}
}