洛谷 P1012 拼数 (C语言解题答案)

题目介绍:

解题思想很简单:  两个数 a  b      左右拼起来        比较ab  ba 大小即可   

   如果 ab大 那就把   a放前面       

           ba大  那就把  b放前面

首先 有n个数来进行比较     可以采用qsort函数 来进行排序   我们设置比较函数就行    

也可以用冒泡法   主要思想就是   如何比较两个数 

我一开始想的是      用乘法来 拼ab

上述代码很好实现  

但是!!!  注意数的范围

显然 两个10^9  这样的乘起来的话   long long型的都顶不住 会超范围 

这里就可以采用  字符数组来拼数  每个元素存一位值  来比较大小即可 

上代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<stdlib.h>


int  cmp(const void* e1, const void* e2)
{
	char arr1[25];
	char arr2[25];
	long long a = (*((long long*)e1));
	long long b = (*((long long*)e2));
	long long c = a;
	long long d = b;
	int i = 0;
	while (a)
	{
		arr1[i] = a%10;
		i++;
		a = a / 10;
	}
	while (b)
	{
		arr1[i] = b % 10;
		i++;
		b = b / 10;
	}
	int j = 0;
	while (d)
	{
		arr2[j] = d % 10;
		j++;
		d = d / 10;
	}
	while (c)
	{
		arr2[j] = c % 10;
		j++;
		c = c / 10;
	}
	i = i - 1;
	for (; i >= 0; --i)
	{
		if (arr1[i] > arr2[i])
			return 1;
		else
			if (arr1[i] < arr2[i])
				return -1;
	}
	return 0;

}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int long long arr[20] = { 0 };    
	int i = 0;
	for (i = 0; i <= n - 1; ++i)
		scanf("%lld", &arr[i]);

	qsort(arr, n, sizeof(arr[0]), cmp);  //快速排序  降序


	

	for (i = 0; i <= n - 1; ++i)
	{
		printf("%lld", arr[i]);
	}


	return 0;
}



稍微解释一下:有了上述思想  具体代码实现应该不是问题   

上述代码  函数里面的代码 还可以优化  这里就交给你们了。

两个我都   倒着存的   因为模10比较方便   最后比较从 后面往 前面 比较就行 

 

qsort  快速排序函数  还是比较重要的

读者一定要去研读一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值