标签:acm
参考文章:题意是给出一个数,求出这个数的任意一个倍数,这个倍数必须由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是数据限制,来自参考文章。
然后由于数据很大,所以必须用无符号的长×××储存。
标签:acm
原文地址:http://blog.51cto.com/13688928/2106132