问题来源
问题描述
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
输入
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。
输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
输出
对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。
例子
AC的代码
#include <iostream>
#include<string>
using namespace std;
int main()
{
int j = 0, i = 0, b[500], t = 0, s = 0, k = 1, r = 0,q=0,h=0;
string a;
while (cin >> a)
{
j = 0;
i = 0;
t = 0;
k = 1;
r = 0;
h = 0;
s = 0;
q = 0;
a = a + '/';
while (a[j] != '/')
{
j++;
}
i = j - 1;
while (i >= 0)
{
if (a[0] != '5'&&i == 0)
{
if (h != 0 || a[1] == '5')
{
b[q] = s + k * (int)(a[0] - 48);
break;
}
else
{
b[q] = s;
break;
}
}
else if (i == 0)
{
b[q] = s;
break;
}
if (a[i] == '5')
{
if (a[i - 1] == '5')
{
i--;
continue;
}
{
}
if (r)
{
b[q] = s;
s = 0;
k = 1;
q++;
h = 0;
}
i--;
continue;
}
r++;
if (a[i] != 5)
{
s = (int)(a[i] - 48)*k + s;
k = k * 10;
h++;
}
i--;
}int e = 0;
for (; e < q; e++)
{
for (int g = 1+e; g <= q; g++)
{
if (b[e] > b[g])
{
int temp = b[e];
b[e] = b[g];
b[g] = temp;
}
}
}
for (int z = 0; z <= q; z++)
{
cout << b[z];
if (z != q)
{
cout << " ";
}
}
cout << endl;
}
}
解题思路
用字符串a存储数字串。在字符串后加字符‘/’,while循环得到数字长度j,倒序检查字符串a,将不等于‘5’的数字转换到b数组中,再排序,输出。用大的while循环包含以上所有步骤并重置相关的值。