题目连接:Find The Multiple
题目大意:
给定正整数n,编写程序找出非零值n的倍数m,并且m的十进制数表示仅包含数字0和1。你可以假设n不大于200,且有不超过100位的相应m。
样例输入
2
6
19
0
样例输出
10
1110
11001
分析:暴力求解的话要枚举在整个搜索空间(小于100位的整数)中所有倍数,计算量非常大。因此可以转换思路,先找出由0和1组成的数,然后判断这个数是否为n的倍数。 于是,可将由0和1组成的数字num作为一个搜索状态,能由num扩展得到的状态有两个,一个是10num,一个是10num+1。
可以通过宽度优先搜索来查找m并判断是否为n的倍数。题目中没限制n的倍数是第几个,因此只要输出就可以了。
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
void BFS(int n)
{
queue <long long > number;
number.push(1);
while(!number.empty()){
long long current = number.front();//先进先出,取队首
number.pop(); //获取后弹出
if(current % n == 0){
printf("%lld\n",current);
return;
}
number.push(current *10);
number.push(current *10 +1);
}
}
int main()
{
int n;
while(scanf("%d",&n) != EOF){
if(n == 0){
break;
}
BFS(n);
}
return 0;
}
宽度优先搜索相关:[农夫找牛]玛雅人的密码(https://blog.csdn.net/weixin_42114926/article/details/105528792)