题目
1174: 长整数排序(指针专题)
时间限制: 1 Sec 内存限制: 128 MB
提交: 4316 解决: 2108
长整数排序。输入n 然后输入n个位数不超过100位的大整数,输入的整数可能含有前导0。将这n个长整数排序后输出,输出不含前导0。
int greater(char *s1, char *s2)
{
若s1指向的整数大于s2指向的整数,返回一个正整数;
若s1指向的整数小于s2指向的整数,返回负整数;
若s1指向的整数等于s2指向的整数,返回0;
}
输入
输入第一行是一个正整数n(n<=10),接下来n行是n个大整数,均非负。
输出
输出n行,为n个升序排序后的大整数。
样例输入 Copy
3
012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
54213456565
113456789456231545674632132156465132123156456423132156465461321654878976464654132132156455
样例输出 Copy
54213456565
12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
113456789456231545674632132156465132123156456423132156465461321654878976464654132132156455
代码
#include <iostream>
#include <string>
using namespace std;
int greaterM(string s1, string s2);
int main() {
int n;
cin >> n;
string * pstr = new string [n];
for ( int i = 0; i < n; i++ ) {
cin >> pstr[i];
int j; // 删除前导 0
for (j = 0; j < pstr[i].size() && pstr[i][j] == '0'; j++);
pstr[i] = pstr[i].substr(j, pstr[i].size() - j);
// 单个或多个 0 的情况
if ( pstr[i].size() == 0 ) pstr[i] = "0";
}
for ( int i = 0; i < n - 1; i++ ) {
int min = i;
for ( int j = i + 1; j < n; j++) { // 简单选择排序
if (greaterM( pstr[i], pstr[j] ) == 1) min = j;
}
string temp_str;
temp_str = pstr[i];
pstr[i] = pstr[min];
pstr[min] = temp_str;
}
// 测试用 cout << "==================" << endl;
for ( int i = 0; i < n; i++ ) {
cout << pstr[i] << endl;
}
// 测试用 cout << greaterM(pstr[0], pstr[1]) << endl;
return 0;
}
int greaterM(string substr1, string substr2)
{
// 若s1指向的整数大于s2指向的整数,返回一个正整数;
// 若s1指向的整数小于s2指向的整数,返回负整数;
// 若s1指向的整数等于s2指向的整数,返回0;
if ( substr1.size() > substr2.size() ) return 1;
else if ( substr1.size() < substr2.size() ) return -1;
else {
int len = substr1.size();
for (int i = 0; i < len; i++) {
if ( substr1[i] > substr2[i] ) return 1;
else if ( substr1[i] < substr2[i] ) return -1;
else continue;
}
return 0;
}
}
总结
处理前导 0 和 单个或多个 0 的时候,要额外注意
今天的时间要抓住,完成每日基本目标,如,数学,专业课,英语,以及完成最重要的 AC 和 OJ 任务,C++ 和 算法数据 要完成当日基本任务及以上