ACM_51nod_1109_01组成的N的倍数

1109 01组成的N的倍数

基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题

问题解释
给定一个自然数N,找出一个M,使得M > 0且M是N的倍数,并且M的10进制表示只包含0或1。求最小的M。
例如:N = 4,M = 100。
Input
输入1个数N。(1 <= N <= 10^6)
Output
输出符合条件的最小的M。
Input示例
4
Output示例
100
问题分析
dfs搜索*10和*10+1两个方向,n限制为1e6,计算的m可能会超出ll数据类型的范围,所以自定义一个结构体,用字符数组储存01串m,用int记录m%n;
注意
记录01串用string类型会mle
AC代码
#include <iostream>
#include<queue>
#include<string>
using namespace std;
#define ll long long int
struct node {
	char str[50];
	int size = 1;
	ll m;
}num;
int n;
string dfs() {
	if (n == 1)
		return "1";
	queue<node> q;
	num.m = 1;
	num.str[num.size-1] = '1';
	q.push(num);
	node tem;
	while (!q.empty()) {
		tem = q.front();
		q.pop();

		tem.m = tem.m * 10%n;
		tem.str[tem.size++] ='0';
		if (tem.m% n == 0)
			return tem.str;
		q.push(tem);

		tem.m = (tem.m + 1)%n;
		tem.str[tem.size-1] = '1';
		if (tem.m% n == 0)
			return tem.str;
		q.push(tem);
	}
}
int main()
{
	while (cin>>n) {
		cout << dfs() << endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值