版权声明:蒟蒻的博客,留个链接就是了…… https://blog.csdn.net/qq_42817441/article/details/88824653
题目大意
给你一个数n
,要你求对应的m
,m
有如下要求:
- 是
n
的倍数 - 每一位仅由0或1组成
思路/思想
一开始拿道题比较懵,如果是搜索的话又该如何搜,十八个for
,或是DFS??
我也不知道啊啊啊啊……
然后听学长讲了下,发现原来蛮简单的……
其实吧,因为你只能加0或1,也就是*10
与*10+1
,所以你可以一路DFS下去,每次位数加1。
然后也不用剪枝,只用判断是否搜过头了(18位)。
代码
#include<cstdio>
using namespace std;
int n;
bool flag;
void dfs(long long m,int step)
{
if(flag||step>18) return;
if(m%n==0){
printf("%lld\n",m);
flag=1;
}
dfs(m*10,step+1);
dfs(m*10+1,step+1);
}
int main()
{
while(scanf("%d",&n)!=EOF){
if(n==0) break;
flag=0;
dfs(1,0);
}
}