最大数串连接

题目描述

设有n个正整数,将他们连接成一排,组成一个最大的多位整数。
如:n=3时,3个整数13,312,343,连成的最大整数为34331213。
如:n=4时,4个整数7,13,4,246连接成的最大整数为7424613。

输入描述:

有多组测试样例,每组测试样例包含两行,第一行为一个整数N(N<=100),第二行包含N个数(每个数不超过1000,空格分开)。

输出描述:

每组数据输出一个表示最大的整数。

示例1

输入

复制

2
12 123
4
7 13 4 246

输出

复制

12312
7424613

思路:把所有数字都统一位数。本题统一为3位数。具体情况以下列标准分:

         一、7变为777,因为7需要插在776前面,而需要插在778后面;与777的位置可以颠倒。

        二、48需要插在484前面,而需要插在485后面,给48和484比较的时候需要追加约束条件。

实现代码如下:

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
void Sort(int *a,int n)
{
    int b[100];
    //mark array
    //int c[100];
    for(int i=0;i<n;i++)
    { 
        b[i]=a[i];
    }
   
    //排序,不妨把所有数都统一位数,本题中统一为3位;统一方法*10或100再加上某个数;如7变成777;65变成656;93变为939----算法完备性需证明
    //还有一问题484和48谁排在前面本题上述方法无法奏效,需要追加判断
    for(int i=0;i<n;i++)
    {
        if(b[i]<10)
            b[i]=b[i]+b[i]*10+b[i]*100;
        if( b[i]>=10 && b[i] < 100)
            b[i]=b[i]*10+b[i]/10;
    }
    //临摹排序即可
    int temp;
    for(int i=0;i<n;i++)
    {
        for(int j=n-1;j>i;j--)
        {
            if(b[j]>b[j-1])
            {
                temp=b[j];
                b[j]=b[j-1];
                b[j-1]=temp;
                //临摹
                temp=a[j];
                a[j]=a[j-1];
                a[j-1]=temp;
            }
            //对称情况追加判断
            else if(b[j] == b[j-1])
            {
                if(a[j] == a[j-1])
                    continue;
                else if(a[j] < 100 && a[j] >= 10) //特殊情况必然存在一个两位数
                {
                    if(a[j]*1000+b[j-1] > b[j-1]*100+a[j])
                    {
                         temp=b[j];
                        b[j]=b[j-1];
                        b[j-1]=temp;
                        //临摹
                        temp=a[j];
                        a[j]=a[j-1];
                        a[j-1]=temp;
                    }
                }
                else if(a[j-1] < 100 && a[j-1] >= 10)
                {
                    if(a[j-1]*1000+b[j] < b[j]*100+a[j-1])
                    {
                         temp=b[j];
                         b[j]=b[j-1];
                         b[j-1]=temp;
                         //临摹
                        temp=a[j];
                        a[j]=a[j-1];
                        a[j-1]=temp;
                    }
                }
            }
        }
    }
}
int main()
{
    int a[100],n;
    //cout<<"Please input the number of your input:"<<endl;
    cin>>n;
    //cout<<"Please input the numbers"<<endl;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    Sort(a,n);
    for(int j=0;j<n;j++)
    {
        cout<<a[j];
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42034505/article/details/81100901