AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
struct node{
int mod;
string ans;
}no[205];
int vis[205];
void bfs(int i){
memset(vis,0,sizeof(vis));
vis[1] = 1;
node cur;
queue<node> q;
int x,y;
cur.mod = 1;cur.ans = "1";
q.push(cur);
while(!q.empty()){
cur = q.front();
q.pop();
x = (cur.mod*10)%i;
y = (cur.mod*10+1)%i;
if(!x){
no[i].ans = cur.ans+"0";
return ;
}
if(!y){
no[i].ans = cur.ans+"1";
return ;
}
if(!vis[x]){
vis[x] = 1;
q.push(node{x,cur.ans+"0"});
}
if(!vis[y]){
vis[y] = 1;
q.push(node{y,cur.ans+"1"});
}
}
}
int main(){
no[1].ans = "1";
for(int i = 2; i <= 200; i++){
if(i % 2 == 0)
no[i].ans = no[i/2].ans+"0";
else
bfs(i);
}
int n;
while(scanf("%d",&n),n){
cout<<no[n].ans<<endl;
}
return 0;
}
后发现所求解的最大值不超过long long,所以代码可简化为:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
typedef long long ll;
void bfs(int n){
queue<ll>q;
q.push(1);
while(!q.empty()){
ll cur = q.front();
q.pop();
if(cur % n == 0){
printf("%lld\n",cur);
return ;
}
q.push(cur*10);
q.push(cur*10+1);
}
}
int main(){
int n;
while(scanf("%d",&n),n){
bfs(n);
}
return 0;
}