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

这篇博客主要讨论了一道编程题目,要求找到一个仅由0和1组成的非零十进制数,该数是给定整数n的倍数。通过深度优先搜索(DFS)策略来寻找解决方案,并在搜索过程中进行剪枝以避免超过long long类型的范围。关键在于正确设置剪枝条件,确保在不超过18位的情况下找到答案。代码中展示了如何实现这一算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值