原题:
Find The Multiple
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
分析:
设 x mod n 等于r1, 则 (x*10 + y ) mod n 就等于 (r1*10+y) mod n .
本题的状态就是模n的余数, 目标状态是零. 我用的是BFS, 状态转移方程是:
NewState = ( State*10 + i )%n ; 其中 i 是加入的末位数, 取值为1或0 .
My Code:
//1426 Find The Multiple
#include <iostream>
using namespace std;
struct node
{
int pre;
int value;
int remainder;
};
int n;
node queue[201];
bool used[201];
void show(int pre)
{
if(pre==0)
{
printf("%d",queue[pre].value);
return ;
}
show(queue[pre].pre);
printf("%d",queue[pre].value);
return ;
}
int main(void)
{
int front,tail,pre;
int remainder,tmp;
while(cin>>n)
{
if( n==0 )
break ;
memset(used,0,sizeof(used));
front=tail=0 ;
queue[tail].pre=-1;
queue[tail].value=1;
queue[tail++].remainder=1%n;
while(front!=tail)
{
remainder = queue[front++].remainder;
if(remainder==0)
{
pre = front-1;
break;
}
for(int i=0;i<2;i++)
{
tmp = (remainder*10+i)%n ;
if( !used[tmp] )
{
used[tmp] = 1;
queue[tail].pre = front-1;
queue[tail].value = i;
queue[tail++].remainder = tmp ;
}
}
}
show(pre);
printf("/n");
}
system("pause");
return 0;
}