E - Find The Multiple
Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal representation contains only the digits 0 and 1. You may assume that n is not greater than 200 and there is a corresponding m containing no more than 100 decimal digits.
Input
The input file may contain multiple test cases. Each line contains a value of n (1 <= n <= 200). A line containing a zero terminates the input.
Output
For each value of n in the input print a line containing the corresponding value of m. The decimal representation of m must not contain more than 100 digits. If there are multiple solutions for a given value of n, any one of them is acceptable.
Sample Input
2 6 19 0
Sample Output
10 100100100100100100 111111111111111111
题目大意
输入一个整数,输出一个能整除它的数,这个数很特别,它只包含0和1。
思路
1:只含有0,1的数可以这样求得,利用1,给它乘以10,给它乘以10后加1.每次对一它进行这两种操作
2:有两种方法,第一种DFS,用递归来做,终止递归的判别条件是,当这个数的长度超过19时,强制跳出当前的这条路,换一条路走。缺点是一条道走到黑,错过了中途好多的风景。另一种方法是BFS,利用循环和队列来做,因为是广搜,所以可以从前往后一步一步的判断。
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.empty())
{
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;
}
dfs:
#include<stdio.h>
#include<math.h>
int m,flag=1;
void dfs(long long n)
{
if(n % m == 0) //如果成立,则flag=0
{
printf("%lld\n",n);
flag = 0;//主要时阻止递归的继续
return ;
}
if(n >= pow(10,18)) //判断出界条件
return ;
if(flag)
dfs(n*10);
if(flag)
dfs(n*10+1);
}
int main()
{
while(scanf("%d",&m)&&m)
{
flag = 1;
dfs(1);
}
return 0;
}