C语言 P1012 [NOIP1998 提高组] 拼数
题目
题目描述
设有 n 个正整数 a_1…… n_a ,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。
输入格式
第一行有一个整数,表示数字个数 n。
第二行有n个整数,表示给出的 n 个整数 a_i
输出格式
一个正整数,表示最大的整数
输入输出样例
思路及中途问题
错误示范
int cmp(const void* e1, const void* e2)//错误示范错误示范
{
int n = 0;
/*char* str1 = ((P*)e1)->a;
char* str2 = ((P*)e2)->a;*/
char p1 = *((P*)e1)->a;
char p2 = *((P*)e2)->a;
while (n<=20)
{
if (*((P*)e1)->a == *((P*)e2)->a)
{
((P*)e1)->a)++;
((P*)e2)->a++;
n++;
}
else
{
if (*((P*)e1)->a == '\0'&&p1>*((P*)e2)->a)
{
return strcmp(((P*)e2)->a, ((P*)e1)->a);
}
else if (*((P*)e2)->a == '\0' && p2 > *((P*)e1)->a)
{
return strcmp(((P*)e2)->a, ((P*)e1)->a);
}
else
return strcmp(((P*)e1)->a, ((P*)e2)->a);
}
}
}
这种直接用((P*)e1)->来写,没有char* str1 = ((P*)e1)->a这一步,看起来虽然一样,但是会出现C2105的问题,具体如下
AC代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct shuzi//C语言没有字符串类型,用结构体代替
{
char a[10];
}P;
int cmp(const void* e1, const void* e2)//如果直接用strcmp直接比较,无法判断32,321等,321大于32,但是32132小于32321
{
int n = 0;
char* str1 = ((P*)e1)->a;
char* str2 = ((P*)e2)->a;
char p1 = *str1;
char p2 = *str2;
while (n<=20)//确定循环次数
{
if (*str1 == *str2)//如果两个数相同,向后一个元素
{
str1++;
str2++;
n++;
}
else
{
if (*str1 == '\0'&&p1>*str2 )//一个找到最后\0出,相互比较,反向输出,形如32,321
{
return strcmp(str2, str1);
}
else if (*str2 == '\0' && p2 > *str1)//同上
{
return strcmp(str2, str1);
}
else
return strcmp(str1, str2);//只剩最后一种情况,直接比较
}
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int i = 0;
P s[20];//结构体数组
for (i = 0; i < n; i++)
{
scanf("%s", &s[i].a);//输入数据
}
qsort(s, n, sizeof(P), cmp);//qsort函数排序
for (i = n - 1; i >= 0; i--)
{
printf("%s", s[i].a);//从大到小输出
}
return 0;
}