設有n個正整數,將他們連線成一排,組成乙個最大的多位整數。例如:n=3時,3個整數13,312,343,連成的最大整數為:34331213
又如:n=4時,4個整數7,13,4,246連線成的最大整數為7424613
輸入:n
n個數輸出:連線成的多位數
演算法分析:此題很容易想到使用貪心法,在考試時有很多同學把整數按從大到小的順序連線起來,測試題目的例子也都符合,但最後測試的結果卻不全對。按這種貪心標準,我們很容易找到反例:12,121 應該組成12121而非12112,那麼是不是相互包含的時候就從小到大呢?也不一定,如:12,123 就是12312而非12112,這樣情況就有很多種了。是不是此題不能用貪心法呢?
其實此題是可以用貪心法來求解,只是剛才的貪心標準不對,正確的貪心標準是:先把整數化成字串,然後再比較a+b和b+a,如果a+b>b+a,就把a排在b的前面,反之則把a排在b的後面。
舉例說明正常的字串比較缺陷!如:a=』321』,b=』32』,按照標準的字串比較規則因為a>b,所以a+b > b+a ,而實際上』32132』 < 』32321』。
所以,自定義一種字串的比較規則:即如果a+b>b+a,則我們認為a>b。且可以證明:如果a+b>=b+a,b+c>=c+b,則一定有:a+c>=c+a。
這樣一來,程式就很簡單了。分3步,先把n個數字轉換成字串儲存;再按照自定義的規則把n個字串排序;最後按照從小到大的順序輸出這些字串(如果從大到小則是求最大的多位整數)。
我的**:
#include
#include
#include
#include
using namespace std;
string converttostring(int num)
int main()
string a,b;
vector::iterator it=vec.begin();
a=converttostring(*it);
for (it=vec.begin()+1;it!=vec.end();it++)
cout< cout< return 0;
}來自網上的一段**:
#include
#include
#include
class number
bool operator <(const number&target)const
; const char*getstr()const;
private:
std::string str;
}; typedef std::set numbers;
void test(number*target,int len)
int main()
; number all=;
number all1=;
number all2=;
number all4=;
#define test(t) test((t),sizeof(t)/sizeof(number))
test(all3);
test(all);
test(all1);
test(all2);
test(all4);
system("pause");
return 0; }
《演算法之美》 n個數連線得到最小的多位整數
題目 設有n個正整數,將它們連線成一排,組成乙個最小的多位整數?例如 n 2時,2個整數32,321連線成的最小整數是 32132 n 4時,4個整數55,31,312,33連線成的最小整數為 312313355。解答 由於題目涉及到整數的連線,如果直接進行整數的連線,可能會超出整數的表示範圍,因此...
《演算法之美》 n個數連線得到最小的多位整數
題目 設有n個正整數,將它們連線成一排,組成乙個最小的多位整數?例如 n 2時,2個整數32,321連線成的最小整數是 32132 n 4時,4個整數55,31,312,33連線成的最小整數為 312313355。解答 由於題目涉及到整數的連線,如果直接進行整數的連線,可能會超出整數的表示範圍,因此...
字串排序 n個數連線得到最小或最大的多位整數
描述 設有n個正整數,將它們依次連成在一排,組成乙個多位數,現在要求可能組成的多位數中最大的多位數是什麼?例如 n 3時,3個整數13,312,343連成的最大多位數為 343 312 13。例如 n 4時,4個證書7,13,4,246連成的最大多位數為 7 4 246 13。輸入 n個整數,eof...