xmuoj-大数排序

描述

小鲁虽然编程能力很一般,但是嘴皮子上不服输。他很喜欢拿自己不懂的问题考小华。

刚学会冒泡排序的他,决定挑战一下小华的智商:

给定你一个长度为n的整数数列。

请你对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

小鲁刻意隐瞒了数据的规模,你觉得小华能够搞定吗?

偷偷告诉你:1≤n≤100000,所有整数均在1--10^9范围内

后记:小华使用快速排序秒过,小鲁惨败,因为他看不懂小华的代码......

输入

输入共两行,第一行包含整数 n。

第二行包含 n 个整数,表示整个数列。

输出

输出共一行,包含 n 个整数,表示排好序的数列。

输入样例 1 

12
111584322 907287398 13562672 615771042 83035480 323016588 501254568 158361642 388135644 58329696 400904710 38908140

输出样例 1

13562672 38908140 58329696 83035480 111584322 158361642 323016588 388135644 400904710 501254568 615771042 907287398 

这一题就是使用快速排序,具体算法思路就看别的文章了,但是因为这一题的数据量很大,在C++中scanf、printf的效率比cin、cout的效率快很多,所以在读取和输出时要使用scanf和printf,这样子才不会有的点运行超时。


参考代码

#include <iostream>

using namespace std;
int partition(int arr[], int left, int right)
{
    int base = arr[left];
    while (left < right)
    {
        while (left < right && arr[right] >= base)
        {
            right--;
        }
        arr[left] = arr[right];
        while (left < right && arr[left] <= base)
        {
            left++;
        }
        arr[right] = arr[left];
    }
    arr[left] = base;
    return left;
}

void sort(int arr[], int left, int right)
{
    if (left >= right)
        return;
    int pivot = partition(arr, left, right); 
    sort(arr, left, pivot - 1);
    sort(arr, pivot + 1, right);
}
int main()
{
    int n;
    cin >> n;
    int *arr = new int[n];
    for (int i = 0; i < n; i++)
        scanf("%d",&arr[i]);
    sort(arr, 0, n-1);
    for (int i = 0; i < n; i++)
        printf("%d ",arr[i]);
    return 0;

}

参考视频Andy讲解

在PTA平台的jmu - c题目中,处理大数乘法时,由于普通的数据类型无法存储极大的数值,因此可以采用反向存储数字每一位的方式来解决,这种做法能避免在内存中存储整个大数的字符串表示,仅需存储每一位数字,在输出时可按正常顺序读取和打印 [^2]。 以下是一个处理大数乘法的解题思路与代码示例: #### 解题思路 1. **输入处理**:接收两个大数作为输入,通常以字符串形式输入。 2. **存储方式**:使用数组反向存储每一位数字。 3. **乘法运算**:模拟手动乘法的过程,逐位相乘并累加结果。 4. **进位处理**:处理每一位相乘后的进位。 5. **输出结果**:去除前导零后按正常顺序输出结果。 #### 代码示例 ```c #include <stdio.h> #include <string.h> #define MAX_LEN 1000 void multiply(char num1[], char num2[], char result[]) { int len1 = strlen(num1); int len2 = strlen(num2); int res[MAX_LEN * 2] = {0}; // 逐位相乘 for (int i = len1 - 1; i >= 0; i--) { for (int j = len2 - 1; j >= 0; j--) { int mul = (num1[i] - '0') * (num2[j] - '0'); int sum = mul + res[i + j + 1]; res[i + j + 1] = sum % 10; res[i + j] += sum / 10; } } // 将结果存入字符串 int index = 0; int i = 0; while (i < len1 + len2 && res[i] == 0) { i++; } if (i == len1 + len2) { result[index++] = '0'; } else { while (i < len1 + len2) { result[index++] = res[i++] + '0'; } } result[index] = '\0'; } int main() { char num1[MAX_LEN], num2[MAX_LEN], result[MAX_LEN * 2]; scanf("%s %s", num1, num2); multiply(num1, num2, result); printf("%s\n", result); return 0; } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值