每日一题(14)——找到符合要求的整数

本文探讨了如何找到两个数的和等于给定目标和的问题,提出穷举、排序后二分查找、哈希映射等方法,并讨论了在不同情况下的时间复杂度和空间复杂度。此外,还涉及到了寻找满足特定条件的整数,如仅包含1和0的十进制数,以及数组中和为目标的两个数字。
摘要由CSDN通过智能技术生成

问题描述:

任意给定一个正整数N,求一个最小的整数M(M>1),使得M*N的十进制结果只含有1和0;

问题解答:

1.穷举法

for( M=2; ; M++)

{

if ( hasOnlyZeroAndOne(M*N))

{ cout; break;}

}

一旦N较大,比如N=99,M=1122334455667789,M*N=111,111,111,111,111

 

2.问题转换:

原问题可以转化为:求一个只含有1与0正整数,能被N整除;

观察X的取值:1,10, 11, 100, 101, 110, 111,1000……

再引入一个变量 j=X%N, 直接遍历X,

 

通过一个队列存储值和余数j,当j出现过时,乘以10,乘以10加1,跟余数相同的前面那个数效果一样,所以可以不计算。

 

#include <iostream>
#include <queue>
using namespace std;
struct QNode
{
	int v,r;//v is value, r is remainder
	QNode(int vv, int rr): v(vv), r(rr){}
	QNode():v(0),r(0){}
};

int main()
{
	int N;
	while(cin>>N)
	{
		queue<QNode> q;
		q.push(QNode(1,1));
		while(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值