题目大意:给出一个正整数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
- #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[n].ans<<endl;
- }
- return 0;
- }
本文介绍了一种使用广度优先搜索(BFS)算法来解决特定数学问题的方法:给定一个正整数n,如何找到其倍数m,使得m仅由0和1组成且不超过100位数。通过逐步扩展数字并利用模运算,该算法能够有效地找到符合条件的最小倍数。
1688

被折叠的 条评论
为什么被折叠?



