首先我们为了方便比较哈, 我们选择用字符串来存储每个数字
我们定义一个数组q, 用来存储数字, 然后我们按照一定的规则,对数组进行一个排序,
最后输出数组就好了
这里面比较关键的就是这个规则,该怎么比较“大小”呢
假如, 我们现在有a, b两个数字,并且 a 的位置原先在 b 的前面
先假设a 的数位大于b 的数位,那么, 首先我们应该在不超过b 的数位的情况下, 从二者
的最高位开始比较,此时又可以分为两种情况, 就是当b 的数位结束时,二者相应位置的
数字都相同或者至少有一个不同
如果说中间有一个数字不同, 那么就假设a 的相应位置的数大于 b 的相应位置的数, 如
果假设成立, 那么a 和 b 的位置都不变,否则二者交换位置
如果说相应位置都相同, 就在b 的数位的基础上, 在a 上再往后看一位, 如果说这
一位的数字小于等于b 的最高位的数字, 那么,二者交换位置, 否则不交换
举个例子
如果说a 的数位小于等于b 的数位, 并且 a 的位置还在前面
我们仍然同时从二者的最高位开始比较, 如果说再不超过a 的数位的情况下, 中间某
个位置的数字大小不同, 如果此位置a 的数字数值较大, 则不改变位置, 否则交换
如果说再不超过a 的数位的情况下, 其对应位置的数字的数值都和b 相同, 则在b 再
往后看一位, 如果说这一位小于等于 a 的首位, 那么二者不变, 否则交换位置
ok, 可以上代码了
额,代码跟思路有那么一点儿出入,不过影响不大
#include <iostream>
using namespace std;
const int N = 30;
string q[N], tmp[N];
bool cmp(string a, string b){
if (a.size() > b.size()){
int l = b.size() - 1;
for (int i = 0; i <= l; i ++)
if (a[i] != b[i]) return a[i] > b[i];
if (a[l + 1] >= b[0]) return true;
return false;
}else {
int l = a.size() - 1;
for (int i = 0; i <= l; i ++)
if (a[i] != b[i]) return a[i] > b[i];
if (a[0] < b[l + 1]) return false;
else return true;
}
}
int main(){
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i ++)
cin >> q[i];
for (int i = 1; i <= n; i ++)
for (int j = 1; j < n; j ++)
if (!cmp(q[j], q[j + 1])) swap(q[j], q[j + 1]);
for (int i = 1; i <= n; i ++)
cout << q[i];
return 0;
}