VJ第五题排序
HDU - 1106
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
Input
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。
输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
Output
对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。
Sample Input
0051231232050775
Sample Output
0 77 12312320
程序说明:
1.程序分为三部分:
①分割
②把分割后的数字赋值到数组
③通过冒泡排序把数值进行从小到大排列
④输出
2.分割部分操作分三部
①假如数字一开始就是’5’,则通过continue跳过;
②通过string头文件包含的find函数,找到最近的一个‘5’的下标;
注意假如找不到‘5’,find函数会返回string::npos,string::npos是一个常量;
③找到分割成一段的数字后对其进行判断
1.是否全是0,是则赋ASCII码0;
2.假如不是,则把数字的前半段的‘0’全部删掉;
④假如找不到‘5’说明已经分割到了最后一段,操作同上;
(程序有可简化的空间)
3.通过冒泡排序把数值进行从小到大排列(课本有)
4.输出
!注意:最后一个不要输出空格,否则就会不能通过;
(细节)
#include<iostream>
#include<string>
using namespace std;
int main()
{
string a[1], b[1000]; int e,jishu,c[1000];
while (cin >> a[0])
{
e = a[0].size();
jishu = 0;//用于计算有多少个b数组;
for (int i = 0; i < e; i++) //————————————断开
{
if (a[0][i] == '5')
{
continue;
}
else
{
if (a[0].find(53, i) != string::npos) //——————————————————寻找出现的5
{
int j = a[0].find(53, i); //把下标给j
bool flag = true; //真假开关
for (int k = i; k < j; k++)
{
if (a[0][k] != '0')
{
flag = false;
break;
}
}
if (flag == true) //判断是不是全部都是0;如果是,则给赋值0给数组b
{
b[jishu] = 48;
jishu++; i = j;//记得把下标的5赋值给i,这样i就回去++重新开始;
continue;
}
if (flag == false) //数组不是全都是0
{
for (int k = i; k < j; k++)
{
if (a[0][k] == '0') //如果开头等于0,则舍弃
{
continue;
}
else
{
for (int z = 0; k < j; k++, z++) //从这里开始赋值给数组b,开头的0全部舍去了
{
if (z == 0)
{
b[jishu] = a[0][k];
}
else
{
b[jishu] = b[jishu] + a[0][k];
}
}
jishu++; //b数组加一
i = j; ////记得把下标的5赋值给i,这样i就回去++重新开始;
break;
}
}
}
}
else //——————————————————————寻找不出5
{
bool flag = true;
for (int k = i; k < e; k++)
{
if (a[0][k] != '0')
{
flag = false;
break;
}
}
if (flag == true) //判断是不是全部都是0;如果是,则给赋值0给数组b
{
b[jishu] = 48;
jishu++; i = e - 1;//记得把下标的5赋值给i,这样i就回去++重新开始;
continue;
}
if (flag == false) //数组不是全都是0
{
for (int k = i; k < e; k++)
{
if (a[0][k] == '0') //如果开头等于0,则舍弃
{
continue;
}
else
{
for (int z = 0; k < e; k++, z++) //从这里开始赋值给数组b,开头的0全部舍去了
{
if (z == 0)
{
b[jishu] = a[0][k];
}
else
{
b[jishu] = b[jishu] + a[0][k];
}
}
jishu++; //b数组加一
i = e - 1; ////记得把下标的5赋值给i,这样i就回去++重新开始;
break;
}
}
}
}
}
}
for (int o = 0; o < jishu; o++)
{
e = b[o].size();
int n=0;
for (int k = 0; k < e; k++)
{
n = b[o][k] - 48 + n * 10;
}
c[o] = n;
}
int temp, work;
for (int pass = 1; pass < jishu; pass++)
{
work = 1;
for (int k = 0; k < jishu-pass ; k++)
{
if (c[k] > c[k+1])
{
temp = c[k];
c[k] = c[k + 1];
c[k + 1] = temp;
work = 0;
}
}
if (work)
{
break;
}
}
for (int k = 0; k < jishu; k++)
{
if (k==jishu-1)
{
cout << c[k];
}
else
{
cout << c[k]<<" ";
}
}
cout << endl;
}
return 0;
}