本文共 1801 字,大约阅读时间需要 6 分钟。
排序
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
Input
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
Output 对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。 Sample Input 0051231232050775 Sample Output 0 77 12312320 问题分析:输入一串数字,把5当空格进行分割得到若干个数,把这些数由小到大输出,每两个数之间有一个空格 程序分析:先用char数组记录输入的数字,然后去5,分割数字,用另一个二维char型数组记录每一个分割得到的数,接下来对每一个数去开头的0,然后把每一个char型数字串转化为int型数,最后对其得到的数进行排列、输出。 其实可以省一些步骤的,当分割完数字得到一个二维char型数组的时候就可以把char型转化为int型,这样可以省略去0的步骤,不过打完代码才想到这个办法。 #include #include #include #include using namespace std; int main() { char a[1010]; while (cin >> a) { char b[505][1010]; int i = 0, i1 = 0, i2 = 0,p=0; while (a[i]) { if (a[i] != ‘5’) b[i1][i2] = a[i], i2++,p=2; else { p–; } if(p1&&a[i]‘5’) { b[i1][i2] = 0, i1++, i2 = 0; } i++; } if (a[i - 1] == ‘5’) i1–; int mm[505]; for (int i2 = 0;i2 <= i1;i2++) { mm[i2] = strlen(b[i2]); } int i4 = 0, i5 = 0, i6 = 0, i11 = 0, i12 = 0; for (;i4 <= i1;i4++) { i5 = 0; if (b[i4][0] == ‘0’) { i12++; while (b[i4][i5]) { b[i4][i5] = b[i4][i5 + 1]; i5++; } b[i4][i5] = 0; } if (i12 == mm[i4]) { b[i4][0] = ‘0’; i12 = 0; } else if (b[i4][0] == ‘0’) i4–; else i12 = 0; } for (int i2 = 0;i2 <= i1;i2++) { int i7 = 0; while (b[i2][i7]) { i7++; } } int c[505]; for (int i = 0;i <= i1;i++) { int e[1010]; c[i] = 0; for (int ii = 0;ii < strlen(b[i]);ii++) { for (int iii = ‘0’, iiii = 0;iii < ‘10’;iii++, iiii++) { if (b[i][ii] == iii) e[ii] = iiii; } c[i] += e[ii] * pow(10, strlen(b[i]) - ii - 1); } } for (int i = 0;i <= i1;i++) { int r = i, s; for (int ii = i;ii <= i1;ii++) { if (c[r] > c[ii]) { r = ii; } } s = c[r]; c[r] = c[i]; c[i] = s; } for (int i = 0;i < i1;i++) cout << c[i] << " "; cout << c[i1]; cout << endl; } }转载地址:http://xgevfk.baihongyu.com/