解題思路:
自定義一種字符串的比較規則:即如果A+B>B+A,則我們認爲A>B。且可以證明:如果A+B>=B+A,B+C>=C+B,則一定有:A+C>=C+A。
分3步,先把n個數字轉換成字符串存儲;
再按照自定義的規則把n個字符串排序;
最後按照從小到大的順序輸出這些字符串(如果從大到小則是求最大的多位整數)。
#include <iostream>
#include <vector>
#include <algorithm>
#include <sstream>
#include <assert.h>
#include <list>
using namespace std;
//自定義判斷字符串大小的函數
bool Compare_min(const string& s1, const string& s2)
{
string ss1 = s1+s2;
string ss2 = s2+s1;
return ss1 < ss2;
}
//判斷拼接的小數字
string Min_number(vector<int> nums)
{
vector<string> nmstr;
string res;
if(nums.empty())
{
return " ";
}
//把數組轉換爲字符串
for(int i = 0; i < nums.size(); i++)
{
//定義一個字符串流來加載數組值
stringstream s;
s << nums[i]; //加載數組裏的值
string tmp;
s >> tmp; //轉換爲字符串
nmstr.push_back(tmp);
}
if(Compare_min)
{
//從小到大排是最小的數字
sort(nmstr.begin(),nmstr.end());
}
//兩兩比較後不斷加上後邊的字符數組
for(int i = 0; i < nmstr.size(); i++)
{
res += nmstr[i];
}
return res;
}
//自定義比較大小
bool Compare_max(const string& s1, const string& s2)
{
string ss1 = s1+s2;
string ss2 = s2+s1;
return ss1 >= ss2;
}
//判斷拼接的大數字
string Max_number(vector<int> nums)
{
vector<string> nmstr;
string res;
if(nums.empty())
{
return " ";
}
for(int i = 0; i < nums.size(); i++)
{
stringstream s;
s << nums[i];
string tmp;
s >> tmp;
nmstr.push_back(tmp);
}
sort(nmstr.begin(),nmstr.end(),Compare_max);
for(int i = 0; i < nums.size(); i++)
{
res += nums[i];
}
return res;
}
int main()
{
int n;
cin >> n;
vector<int> nums(n);
for(int i = 0; i < n; i++)
{
cin >> nums[i];
}
cout << "最小的數字是" << Min_number(nums) << endl;
cout << "最大的數字是" << Max_number(nums) << endl;
return 0;
}