1. 程式人生 > >排序組成最大數(純C)

排序組成最大數(純C)

題目描述 Description

  設有n個正整數(n≤20),將它們聯接成一排,組成一個最大的多位整數。

輸入描述 Input Description

  第一行一個正整數n。

  第二行n個正整數,空格隔開。

輸出描述 Output Description

  連線成的多位數。

樣例輸入 Sample Input

     Sample 1:

     3

     13 312 343

    Sample 2:

    4

    7 13 4 246

樣例輸出 Sample Output

   Sample 1:

  34331213

  Sample 2:

  7424613

資料範圍及提示 Data Size & Hint

   n≤20 

這題我使用純C寫的,用C++的sort會更容易些。思路是對氣泡排序的排序條件進行適當的修改,然後直接輸出即可

#include <stdio.h>
#include <string.h>
#define M 21
#define N 15

void swap(char *a,char *b);
void sort(char num[M][N],int n);

int main(void)
{
	int n=0;
	char num[M][N]={0};
	int i=0,j=0;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%s",num[i]);
	}
	sort(num,n);
	for(j=0;j<n;j++)
	{
		printf("%s",num[j]);
	}
}

void swap(char *a,char *b)  //交換兩個字串
{
	char tmp[N];
	strcpy(tmp,a);
	strcpy(a,b);
	strcpy(b,tmp);
}

void sort(char num[M][N],int n)  //修改過後的氣泡排序
{
	int i=0,j=0,k=0;
	int a=0,b=0;
	for(i=0;i<n-1;i++)
	{
		for(j=0;j<n-1-i;j++)
		{
			a = num[j][k]-'0',b = num[j+1][k]-'0';
			if(a<b){
				swap(num[j],num[j+1]);
				k=0;
				continue;
			}
			else if(a==b&&num[j][k]!='\0'&&num[j+1][k]!='\0'){ //如果此位相等,則K++,讀取第二位
				k++;
				j--;
			}
		}
	}
}