參考文章:
http://user.qzone.qq.com/289065406/blog/1303946967
http://www.cnblogs.com/ACShiryu/archive/2011/07/24/2115356.html
題意是給出一個數,求出這個數的任意一個倍數,這個倍數必須由0或1組成。
思路是反向從結果驗證,即數字只由0或1組成,那麼第一位必定是1,之後的幾位不是1就是0。如果組成的數字可以整除給出的數字,那麼就是答案。否則就加位驗證。
#include<cstdio>
#include<iostream>
using namespace std;
bool result;
void dfs(unsigned long long t,int n,int k){
if(result){
return;
}
if(t%n==0){
cout<<t<<endl;
result=true;
return;
}
if(k==19){
return;
}
dfs(t*10,n,k+1);
dfs(t*10+1,n,k+1);
}
int main(){
int n;
while(~scanf("%d",&n)){
result = false;
if(n==0)
break;
dfs(1,n,0);
}
return 0;
}
這裏的k設定爲19是數據限制,來自參考文章。
然後由於數據很大,所以必須用無符號的長×××儲存。