“Find The Multiple“

        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完成的快。当然了,这个猜想仅代表个人,有懂哥的话希望不要吝啬,讲出来分享一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值