小红的数字拆解

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

小红拿到了一个偶数,她希望你将其切割成尽可能多的偶数。你能帮帮她吗?

输入描述:

一个偶数xxx。
1≤x≤101051\leq x \leq 10^{10^5}1≤x≤10105

输出描述:

输出若干行,从小到大输出每个偶数。

示例1

输入

复制1024

1024

输出

复制2 4 10

2
4
10

说明

拆分成"10"+"2"+"4"三个偶数。

示例2

输入

复制999999999999999999999999990

999999999999999999999999990

输出

复制999999999999999999999999990

999999999999999999999999990

示例3

输入

复制202020

202020

输出

复制0 0 0 2 2 2

0
0
0
2
2
2

这题的做法很简单,就是从最高位往右数,遇到奇数就往后截取到第一次出现的偶数,如果是偶数就直接记录到string数组。

关键在于如何把存入的字符数进行排序,可能有的小伙伴想直接转成数字存进去不就好排序了吗,但是题目可能给一段很长的奇数,这样大到没法表示。排序时加个自定义。

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<vector>
#include<math.h>
#include<iomanip>
#include<set>
#include<queue>
#include<stack> 
#include<map>
#include<list>
using namespace std;
string a;
string b[100005];
bool com(string a,string b)
{
	if(a.length()!=b.length())
	return a.length() < b.length();
	return a < b;
}
int main()
{
	cin >> a;
	int l = 0;
	for (int i = 0; i < a.length();)
	{
		if ((a[i] - 48) % 2 == 0)
		{
			b[l] = a[i];
			i++;
			l++;
		}
		else
		{
			for (int j = i + 1; j < a.length(); j++)
			{
				if ((a[j] - 48) % 2 == 0)
				{
					b[l] = a.substr(i, j - i + 1);
					l++;
					i = i + (j - i) + 1;
					break;
				}
				
			}
		}
	}
	sort(b, b+l,com);
	for (int i = 0; i < l; i++)
	{
		cout << b[i] << endl;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值