链接:登录—专业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;
}
}