注册 登录
编程论坛 C语言论坛

【求助】有一个整数n,现将其各位打乱,求组成的最大数字是什么。 数据很大很大 正常的做法超时

Sky_ 发布于 2019-12-27 21:12, 2643 次点击
有一个整数n,现将其各位打乱,求组成的最大数字是什么。
输入
输入第一行一个整数T,代表接下来有T组测试数据。
每组测试数据有一行,整数n。
数据范围:1≤T≤4,1≤n≤10^10000000.
输出
对于每组测试数据,输出打乱后的最大数字。
提示
排序会造成超时
由于数据很大,请尝试更快的输出方式避免时间超限。
样例输入
2
1234567890
7777777
样例输出
9876543210
7777777




[此贴子已经被作者于2019-12-28 19:30编辑过]

7 回复
#2
八画小子2019-12-27 22:23
那你正常的做法是什么?
#3
forever742019-12-27 23:32
每个数据从头到尾过一遍,统计其中每个数字字符分别有多少个,然后直接输出结果。
#4
Sky_2019-12-28 19:27
回复 2楼 八画小子
好像算作桶排序吧   
就是把数字从大到小输出一遍 超时了

#include<stdio.h>
#include<string.h>
char s[100000000000009];
int a[11];
int main ()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        memset(a,0,sizeof(a));
        scanf("%s",s);
        for(int i=0;s[i];i++)
        {
            a[s[i]-'0']++;
        }
        for(int i=9;i>=0;i--)
        {
            for(int j=1;j<=a[i];j++)
            {
                printf("%d",i);
            }
        }
        printf("\n");
    }
    return 0;
}

#5
Sky_2019-12-28 19:33
回复 3楼 forever74
抱歉 我第一次复制粘贴题目没发现出错了
是10^10000000
这个数据这么大 超时了欸

#6
forever742019-12-28 19:48
这样试试
程序代码:

#include <stdio.h>
void run()
{
    int a[10] = { 0 };
    char ch;
    while ((ch = getchar()) != '\n') a[ch - '0']++;
    for (int i = 9; i >= 0; i--)
        while (a[i]--)putchar((char)(i + 48));
    putchar('\n');
}
int main()
{
    int T;
    scanf("%d",&T);
    while(getchar()!='\n');
    while (T--)run();
}
#7
Sky_2019-12-28 19:59
回复 6楼 forever74
谢谢大佬
答案正确了
不过为什么这样就不超时了呀
不太明白
#8
forever742019-12-28 22:43
也许因为数组太大了运行的时候会频繁触发换页?
1