POJ-1426-Find The Multiple

版权声明:版权归Ordinarv所有 https://blog.csdn.net/ordinarv/article/details/82154698

一、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;
    }
}

https://blog.csdn.net/lyy289065406/article/details/6647917

猜你喜欢

转载自blog.csdn.net/ordinarv/article/details/82154698
今日推荐