VJ第五题排序

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’说明已经分割到了最后一段,操作同上;
(程序有可简化的空间)

扫描二维码关注公众号,回复: 5086986 查看本文章

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;
}

猜你喜欢

转载自blog.csdn.net/qq_26558047/article/details/84888260