题目描述
长整数排序。输入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<stdio.h>
#include<cstring>
#include<cmath>
#include<iomanip>
#include<algorithm>
using namespace std;
char* del(char *c){//删除前置数,返回指针
char *ch = c;
int n = strlen(c);
int i = 0;
for(i = 0; c[i] != '\0'; i++){
if(c[i+1] == '\0')//防止将0整数删除
break;
else if(c[i] != '0')
break;
}
ch = &c[i];//获取地址
return ch;
}
int num(char *s1, char *s2)
{
if(strlen(s1) > strlen(s2))
return 1;
else if(strlen(s1) < strlen(s2))
return -1;
else{
for(int i = 0; i < strlen(s1); i++){
if(s1[i] < s2[i])
return -1;
else if(s1[i] > s2[i])
return 1;
else
continue;
}
}
return 0;
}
int main(void){
int n;
cin >> n;
getchar();
char *array[15];
char *b, *arr;
char c[110];
for(int i = 0; i < n; i++){
scanf("%s",c);
b = del(c);
array[i] = (char*)malloc(sizeof(char)*strlen(b));
strcpy(array[i],b);
}
for(int i = 0; i < n; i++){
for(int j = i+1; j < n; j++){
if(num(array[i],array[j]) > 0){
arr = array[i]; //指针只能直接交换,不能用strcpy函数
array[i] = array[j];
array[j] = arr;
}
}
}
for(int i = 0; i < n; i++){
puts(array[i]);
}
return 0;
}