Find The Multiple(DFS)

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 (0) 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组成,有俩种版本,一个是longlong直接过,这个在数据较多的时候不容易过,

先说下longlong吧,就是从1开始深搜,有2种方向,一是乘以10,二是乘以10再加1,这个简单深搜还是比较好实现的。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<queue>
 6 #include<algorithm>
 7 using namespace std;
 8 int n,flag;
 9 unsigned long long ans;
10 void dfs(unsigned long long x,int y)
11 {
12   if(y>19) return ;
13     if(x%n==0)
14     {
15         flag=1;
16         ans=x;
17         return;
18 
19     }
20     else
21       {for(int i=0;i<2;i++)
22         dfs(10*x+i,y+1);
23       }
24         if(flag) return;
25 
26 
27 }
28 int main()
29 {
30   unsigned long long x;
31   while(cin>>n)
32   {
33       if(n==0) break;
34       x=1;
35       flag=0;
36       dfs(x,0);
37       cout<<ans<<endl;
38 
39 
40   }
41   return 0;
42 
43 }

再看一下数组存储的代码,他这个涉及到的知识点真的不知道,每次得到新数都进行取余再将这个数放入数组里,这样就不会数据溢出了,一开始想这么做怕担心

数据会溢出。

 1 #include <iostream>
 2 
 3  
 4 
 5 using namespace std;
 6 
 7  
 8 
 9 int n, t, a[100], ac,l;
10 
11  
12 
13 void dfs(int c, int s)
14 
15 {
16 
17          if(s==0)//如果余数为0,择停止递归
18 
19          {
20 
21                    ac = 1;//表示已经找到结果
22 
23                    l=c;//给数组的长度赋值
24 
25          }
26 
27          else if(c < 100)//在深度100范围内进行递归
28 
29          {
30 
31                    if(ac==0)//还没找到结果,进行递归运算
32 
33                    {
34 
35                             a[c] = 1;//尝试下一位放1
36 
37                             dfs(c + 1, (s * 10 + 1) % n);
38 
39                    }
40 
41                    if(ac==0)
42 
43                    {
44 
45                             a[c] = 0;
46 
47                             dfs(c + 1, (s * 10) % n);
48 
49                    }
50 
51          }
52 
53 }
54 
55  
56 
57 int main()
58 
59 {
60 
61          while(cin>>n,n)
62 
63          {
64 
65                    a[0] = 1, ac = 0;//初始化
66 
67                    dfs(1, 1);
68 
69                    for(int i=0;i<l;i++) cout<<a[i];//根据递归得到的结果,进行输出
70 
71                    cout<<endl;
72 
73          }
74 
75          return 0;
76 
77 }
78 
79  

 

posted @ 2017-07-29 15:58  余生漫漫浪  阅读(1201)  评论(0编辑  收藏  举报