poj 1426

参考文章:
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是数据限制,来自参考文章。
然后由于数据很大,所以必须用无符号的长×××储存。

猜你喜欢

转载自blog.51cto.com/13688928/2106132