小组中每位都有一张卡片,卡片上是6位内的正整数,将卡片连起来可以组成多种数字,计算组成的最大数字。
输入描述:
","号分割的多个正整数字符串,不需要考虑非数字异常情况,小组最多25个人.
输出描述:
最大的数字字符串
示例1:
输入:22,221
输出:22221
一、问题分析
首先读题,仔细看描述中的内容,发现需求是
1.将多个正整数拼接起来,组成最大的数字字符串
二、解题思路
1.最高位最大的放前面
比如9,8,345,的情况,先放9然后放8然后放345
2.如果遇到相同的情况,我们需要考虑第二位,如果第二位没有我们当作是0,
例如遇到8,81,76
8和81都是8开头的,但是81的第二位是1,8没有第二位,当做0考虑,所以81在前面
3.191,19,但是如果遇到类似小的数字在前面,后面跟着的数字比较大的情况就不适用了
这里191和190对比,191比较大,但是
19119比19191要小
4.然后考虑拼接排序,拼接之后,放在前面使得数字比较大的,放在前面
拼接之后,放在后面使得数字比较大的,放在后面
5.可以使用qsort完成,我们在比较函数中定义两个
三、具体步骤
使用的语言是C
cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare(const void* a, const void* b) {
int x = *(int *)a;
int y = *(int *)b;
unsigned long long sx = 10, sy = 10;
while(sx <= x) sx *= 10;
while(sy <= y) sy *= 10;
return (sx * y + x) > (sy * x + y);
}
char* largestNumber(int* nums, int numsSize) {
qsort(nums, numsSize, sizeof(int), compare);
if(nums[0] == 0 ) return "0";
char* ans = malloc(sizeof(char) * 1000);
char* p = ans;
for(int i = 0; i < numsSize; i++) {
sprintf(p, "%d", nums[i]);
p += strlen(p);
}
return ans;
}
int main(){
int numsSize;
int nums[100];
scanf("%d", &numsSize);
char tempstr[1000];
scanf("%s", tempstr);
nums[0] = atoi(strtok(tempstr,","));
for(int i = 1; i < numsSize; i++){
nums[i] = atoi(strtok(NULL, ","));
}
char *ans = largestNumber(nums, numsSize);
printf("%s\n", ans);
return 0;
}