1174: 长整数排序(指针专题)情况考虑要全面

题目

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++ 和 算法数据 要完成当日基本任务及以上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值