问题:
问题链接:点击打开链接
题目1190:大整数排序
分析:
首先写出大整数的结构体,然后用字符数组进行初始化,最后利用qsort进行排序。
注意qsort的cmp函数的定义。
代码:
#include <iostream>
#include <string.h>
#include <stdlib.h>
#define MAX 1000
#define N 100
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct BigInteger {
int num[MAX]; //每4位放入一个存储单元中
int size ;
void init(){
for(int i=0;i<MAX;i++){
num[i] = 0;
}
size = 0;
}
void set(char *input){
init();
int length = strlen(input);
int c=1;
int count = 0;
int tmp = 0;
for(int i=length-1;i>=0;i--){
tmp+=(input[i]-'0')*c;
c*=10;
count++;
if(count == 4 || i == 0){ //i==0表示已经遍历到了字符串的末尾
num[size++] = tmp ;
c=1;
count=0;
tmp=0;
}
}
}
void display(){
for(int i =size-1;i>=0;i--){
if(i == size-1){
printf("%d",num[i]);
}else{
printf("%04d",num[i]);
}
}
printf("\n");
}
};
int cmp(const void*a,const void*b){
BigInteger p = *(BigInteger*)a;
BigInteger q = *(BigInteger*)b;
if(p.size != q.size){
return p.size-q.size;
}
for(int i=p.size;i>=0;i++){
if(p.num[i] - q.num[i] != 0){
return p.num[i] - q.num[i] ;
}
}
return 0;
}
int main(int argc, char** argv) {
// char input[MAX];
// gets(input);
//
// BigInteger b;
// b.set(input);
// b.display();
//
int n;
while(scanf("%d",&n)!= EOF){
getchar();
BigInteger b[N];
int length = 0;
while(n--){
char tmp[MAX];
gets(tmp);
b[length++].set(tmp);
}
qsort(b,length,sizeof(b[0]),cmp);
for(int i=0;i<length;i++){
b[i].display();
}
}
return 0;
}
代码分析:
qsort函数
头文件 stdlib.h
功 能 使用快速排序例程进行排序
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针
int comp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
Compare 函数的返回值 描述
< 0 elem1将被排在elem2前面
0 elem1 等于 elem2
> 0 elem1 将被排在elem2后面
功 能 使用快速排序例程进行排序
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针
int comp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
Compare 函数的返回值 描述
< 0 elem1将被排在elem2前面
0 elem1 等于 elem2
> 0 elem1 将被排在elem2后面