求m可以被n整除的数(深搜剪枝题)

给一个数n,让你找出一个只由0,和1组成的十进制数m,
要求这个正整数m可以被n整除.
输入格式
输入一个整数n(1<=n<200)

输出格式
对于输入整数n的每一个值,输出m的相应值,保证有一个
数字长度小于19位的数字.如果有一个给定值n有多个解,
其中任何一个都是可以接受的.

题解:一个cnt记录位数,对应m值,搜索加0或者加1;不用遍历每个数值,如果一旦找到,输出就行,不用往下搜索.这个剪枝比较不太明显

代码如下

#include <bits/stdc++.h>
using namespace std;
int n;
bool flag=false;

void dfs(long long m, int cnt) {
    if (cnt >= 19) {
        return;
    }
    if (flag) {
        return;
    }
    if (m % n == 0) {
        flag = true;
        cout << m << endl;
        return;
    }
    dfs(m * 10 + 0, cnt + 1);
    dfs(m * 10 + 1, cnt + 1);
}
int main() {
    cin >> n;
    dfs(1, 0);   
    return 0;
}
原文地址:https://www.cnblogs.com/jachinlin/p/12784971.html