洛谷 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  快速排序函数  还是比较重要的

读者一定要去研读一下

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值