poj1426——Find The Multiple

本文介绍了一种使用广度优先搜索(BFS)算法来解决特定数学问题的方法:给定一个正整数n,如何找到其倍数m,使得m仅由0和1组成且不超过100位数。通过逐步扩展数字并利用模运算,该算法能够有效地找到符合条件的最小倍数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:给出一个正整数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.youkuaiyun.com/wangjian8006/article/details/7460523

  1. #include <iostream>  
  2. #include <string>  
  3. #include <queue>  
  4. using namespace std;  
  5.   
  6. typedef struct{  
  7.     int mod;  
  8.     string ans;  
  9. }Node;  
  10. Node node[210],temp,now;  
  11. bool dis[210];  
  12.   
  13. void bfs(int i){  
  14.     int x,y;  
  15.     queue <Node>q;  
  16.     memset(dis,false,sizeof(dis));  
  17.       
  18.     dis[1]=true;  
  19.     temp.ans="1";  
  20.     temp.mod=1;  
  21.     q.push(temp);  
  22.   
  23.     while(!q.empty()){  
  24.         now=temp=q.front();  
  25.         q.pop();  
  26.   
  27.         x=(temp.mod*10+1)%i;  
  28.         y=(temp.mod*10)%i;  
  29.           
  30.         if(!x){  
  31.             node[i].ans=temp.ans+"1";  
  32.             return ;  
  33.         }  
  34.         if(!y){  
  35.             node[i].ans=temp.ans+"0";  
  36.             return ;  
  37.         }  
  38.         if(!dis[x]){  
  39.             temp.ans=temp.ans+"1";  
  40.             temp.mod=x;  
  41.             q.push(temp);  
  42.             dis[x]=true;  
  43.         }  
  44.         if(!dis[y]){  
  45.             now.ans=now.ans+"0";  
  46.             now.mod=y;  
  47.             q.push(now);  
  48.             dis[y]=true;  
  49.         }  
  50.     }  
  51. }  
  52.   
  53. int main(){  
  54.     int i,n;  
  55.     node[1].ans="1";  
  56.     for(i=2;i<=200;i++){  
  57.         if(i%2==0) node[i].ans=node[i/2].ans+"0";  
  58.         else bfs(i);  
  59.     }  
  60.     while(scanf("%d",&n) && n){  
  61.         cout<<node[n].ans<<endl;  
  62.     }  
  63.     return 0;  
  64. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值