题目大意
输入一个整数,输出一个能整除它的数,这个数很特别,它只包含0和1。
思路
1:只含有0,1的数可以这样求得,利用1,给它乘以10,给它乘以10后加1.每次对一它进行这两种操作
2:有两种方法,第一种DFS,用递归来做,终止递归的判别条件是,当这个数的长度超过19时,强制跳出当前的这条路,换一条路走。缺点是一条道走到黑,错过了中途好多的风景。另一种方法是BFS,利用循环和队列来做,因为是广搜,所以可以从前往后一步一步的判断。
DFS的代码
# include <stdio.h>
int m, flag;
void DFS(int x, long long y)
{
if(x >19 || flag ==1)//flag是用来保证当找到这个数时可以,终止这条路,
{
return;
}
if(y%m == 0)
{
flag = 1;
printf("%lld\n",y);
return ;
}
DFS(x+1, y*10);
DFS(x+1, y*10+1);
}
int main(void)
{
while(~scanf("%d",&m), m)
{
flag = 0;
DFS(1, 1);
}
return 0;
}
BFS的代码
# include <stdio.h>
# include <queue>
using namespace std;
int m;
void BFS(long long x)
{
queue<long long>Q;
Q.push(x);
while(Q.size())
{
long long y = Q.front();
Q.pop();
if(y%m == 0)
{
printf("%lld\n",y);
return;
}
Q.push(y*10);
Q.push(y*10+1);
}
}
int main(void)
{
while(~scanf("%d",&m),m)
{
BFS(1);
}
return 0;
}