大整数排序

问题:

问题链接:点击打开链接
题目1190:大整数排序

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:4867

解决:2172

题目描述:

对N个长度最长可达到1000的数进行排序。

输入:

输入第一行为一个整数N,(1<=N<=100)。
接下来的N行每行有一个数,数的长度范围为1<=len<=1000。
每个数都是一个正数,并且保证不包含前缀零。

输出:

可能有多组测试数据,对于每组数据,将给出的N个数从小到大进行排序,输出排序后的结果,每个数占一行。

样例输入:
3
11111111111111111111111111111
2222222222222222222222222222222222
33333333
样例输出:
33333333
11111111111111111111111111111
2222222222222222222222222222222222
来源:
2006年华中科技大学计算机研究生机试真题


分析:

首先写出大整数的结构体,然后用字符数组进行初始化,最后利用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后面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值