(POJ - 1426)Find The Multiple(搜索)

微言记

关注

阅读 44

2022-02-19

题目链接:1426 -- Find The Multiple

题意:给你一个n,然后让你输出任意一个非零十进制数m使得m是n的倍数且m的十进制表达式中只含有0或1.

这道题显然直接进行dfs搜索就行,但是需要我们剪枝,搜索过程中需要记录两个值,一个是当前搜索到的十进制数,另一个是当前搜索到的位数,剪枝就从搜索到的位数方面开始考虑,若当前搜索到了18位即以后就默认未找到答案,十进制最高位我们i肯定是要从1开始的

需要提醒的是剪枝一定要从18位剪 ,19位会超longlong,但是17位可能搜不到答案,这也是我wa了好多发的原因,其他就没什么了,下面上代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
ll n,ans;
void dfs(ll r,ll pos)
{
	if(pos>18||ans) return ;//注意剪枝 
	if(r%n==0&&r)
	{
		ans=r;
		return ;
	}
	dfs(r*10,pos+1);
	dfs(r*10+1,pos+1);
}
int main()
{
	while(scanf("%lld",&n)&&n)
	{
		ans=0;
		dfs(1,0);
		printf("%lld\n",ans);
	}
	return 0;
}

精彩评论(0)

0 0 举报