Description
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
题目大意:给定一个数n,求出只有1,0组成的且为n的倍数的一个数m(答案不唯一,任意输出一个即可)
先看看DFS
暴力走到底,不撞南墙不回头
#include<stdio.h>
void solve(long long int n,int i);
int n,flag;
int main()
{
while(~scanf("%d",&n)&&n)
{
flag = 0;
solve(1,0);
}
return 0;
}
void solve(long long int x,int i)
{
if(i >= 19 || flag) return;
if(x%n == 0)
{
flag = 1;
printf("%lld\n",x);
}
solve(x*10,i+1);
solve(x*10+1,i+1);
}
再看看BFS
方便快捷,直接求出满足条件的最小m
解题思路:每次都把两种情况入队;满足情况则输出
#include<stdio.h>
struct Q
{
long long int x;
}queue[10000000]; //m不超过20位,根据队列的需求,至少需要2^21-1
void BFS(int n);
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
BFS(n);
}
return 0;
}
void BFS(int n)
{
struct Q temp;
int head = 0,rear = 0;
queue[rear++].x = 1;
while(head < rear) //队列不为空
{
temp = queue[head++]; //队首出队
queue[rear++].x = temp.x*10; //将两种情况分别入队
if(temp.x*10 % n ==0) //满足条件就输出,最小的m(下面同理)
{
printf("%lld\n",temp.x*10);
return;
}
queue[rear++].x = temp.x*10+1;
if(temp.x*10+1 % n == 0)
{
printf("%lld\n",temp.x*10+1);
return;
}
}
}
两种对比,可以发现DFS节约了大量的空间,但用时长;
BFS快捷,但由于使用的是队列,需要使用一个很大的数组,空间需求很大。。。