1.题目分析
本题的题意是让我们求一个数n(n <=200)的m倍的数(即这个数对n取模==0),这个数仅由1和0组成。本题考查的是BFS/DFS。我们可以另x=1,每次对x取x*10和x*10+1来达到这个十进制数是由1,0组成的目的,进而通过判断x % n == 0的操作来判断是否是所求。每次对x取x*10和x*10+1进行操作我们可以使用递归(栈)或者队列进行实现,相应的对应着DFS和BFS。由于本题的n较小,使用long long可以直接过,不用担心溢出问题。
2.代码展示
- 编辑器:Xcode Version 13.1
//题目:http://poj.org/problem?id=1426
#include <cstdio>
typedef long long ll;
bool flag;
void find_DFS(int n, ll m, int x){
if(x > 19 || flag)//flag是用来终止其他路径的
return;
if(m % n == 0){
printf("%lld\n", m);
flag = true;//找到一个解后,其他的路就可以不用走了
return;
}else{
find_DFS(n, m*10, x+1);
find_DFS(n, m*10+1, x+1);
}
}
int main(){
int n;
while (~scanf("%d", &n) && n) {
flag = false;
find_DFS(n, 1, 1);
}
return 0;
}
3.备注
这一题数据量多的话正常要防止溢出要用数组(长度100,因为题目说了不超过100位)进行操作,同时将深度19改为100。另外,这题用BFS也能做出来,不过我在进行poj上提交测试时,总是超时,希望有懂哥能评论指教一下。可能是因为DFS的flag进行了剪枝,一条路走到底,找到后其他路不用走。而BFS需要走每层的每种可能,直到找到符合要求的解后才会return(比如相同的n=6,使用DFS得出的是1000000000000000110,而BFS是1110)。这我认为是算法本身的属性。当大量数据的时候,这题BFS就没有DFS完成的快。当然了,这个猜想仅代表个人,有懂哥的话希望不要吝啬,讲出来分享一下。