您的位置:首页 > 其它

poj1426——Find The Multiple

2017-11-16 17:41 302 查看
题目大意:给出一个正整数n,找出它的倍数m,要求m的十进制形式只由0和1组成并且不超过100位数字

输入:(可以有很多个case,输入以0结尾)

            第i个case的n(1<=n<=200)

输出:(如果有多个m,则输出任意一个)

            第i个case的m

分析:bfs搜索,一位一位地确定,每位只有两种选择即0或1,每次扩展都在末尾加0或1,初始化最高位肯定为1,要注意到如果i为偶数,则不用计算,直接ans[i]=ans[i/2]+"0";

           根据同余模定理,可以将前一步所得的余数当做前一步的字符串

代码:转载自http://blog.csdn.net/wangjian8006/article/details/7460523

#include <iostream>  

#include <string>  

#include <queue>  

using namespace std;  

  

typedef struct{  

    int mod;  

    string ans;  

}Node;  

Node node[210],temp,now;  

bool dis[210];  

  

void bfs(int i){  

    int x,y;  

    queue <Node>q;  

    memset(dis,false,sizeof(dis));  

      

    dis[1]=true;  

    temp.ans="1";  

    temp.mod=1;  

    q.push(temp);  

  

    while(!q.empty()){  

        now=temp=q.front();  

        q.pop();  

  

        x=(temp.mod*10+1)%i;  

        y=(temp.mod*10)%i;  

          

        if(!x){  

            node[i].ans=temp.ans+"1";  

            return ;  

        }  

        if(!y){  

            node[i].ans=temp.ans+"0";  

            return ;  

        }  

        if(!dis[x]){  

            temp.ans=temp.ans+"1";  

            temp.mod=x;  

            q.push(temp);  

            dis[x]=true;  

        }  

        if(!dis[y]){  

            now.ans=now.ans+"0";  

            now.mod=y;  

            q.push(now);  

            dis[y]=true;  

        }  

    }  

}  

  

int main(){  

    int i,n;  

    node[1].ans="1";  

    for(i=2;i<=200;i++){  

        if(i%2==0) node[i].ans=node[i/2].ans+"0";  

        else bfs(i);  

    }  

    while(scanf("%d",&n) && n){  

        cout<<node
.ans<<endl;  

    }  

    return 0;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: