蓝桥杯练习题D

来源:http://oj.mofriend.net/problem.php?cid=1203&pid=3

题目描述
游戏规则是:n个同学,每个同学给出一个非负整数,对于给出的n个非负整数,将这些非负整数前后拼接成一个数。我们知道,不同的接力方式将得到不同的结果。例如n=3时,3个正整数1,2,3的接力结果有:123,132,213,231,312,321
输入

输入数据只有一行,第一行是一个正整数n(0

输出
输出对应的通过接力方式得到的最大正整数。(结尾加一个换行符)

1
2
3
4
5
样例输入
3
1 2 3
样例输出
321

思路: 看到这个题目,我的第一反应是字符串…
用 strcmp 来判断字符创的大小 大的放上面, 不过我们的OJ 有点坑
不允许 使用string 库
所以我手写了一下 strcmp 和 strcopy
开始排序后发现这题目有个大坑!
比如
941 > 9411 这个要这样排序才行
至于为什么 自然是 9419411 > 9411941 这样的方式,还好是手写的strcmp 可以修改,用的库的我不知道 941 和 9411 这两个他会返回怎么样的结果,写起代码也会变得纠结
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
using namespace std;
int strcmp(char * a, char* b) {
int i = 0;
while (a[i] != '\0' && b[i]!='\0') {
if (a[i] > b[i]) {
return 1;
}
else if (a[i] < b[i]) {
return -1;
}
i++;
}
if (b[i] != '\0') {
if (b[i]<a[0])
return 1;
}
if (a[i] != '\0') {
if (a[i]<b[0])
return -1;
}
return 0;
}
int strswitch(char* a, char * b) {
char c[100];
int i = 0;
while (a[i] != '\0') {
c[i] = a[i];
i++;
}
c[i] = a[i];
i = 0;
while (b[i] != '\0') {
a[i] = b[i];
i++;
}
a[i] = b[i];
i = 0;
while (c[i] != '\0') {
b[i] = c[i];
i++;
}
b[i] = c[i];
return 0;
}

int main() {
int n;
char a[100][100];
cin >> n;
for (int i = 0;i<n; i++)
{
cin >> a[i];
}
for (int i = 0; i<n; i++)
{
for (int j = 0; j<n-1-i; j++)
{
if(strcmp(a[j],a[j+1])<0){
strswitch(a[j], a[j + 1]);
}
}
}
for (int i = 0; i<n; i++)
{
cout<<a[i];
}
return 0;
}