題目:設有n個正整數,將它們連線成一排,組成乙個最小的多位整數?
例如:n=2時,2個整數32,321連線成的最小整數是:32132;
n=4時,4個整數55,31,312,33連線成的最小整數為:312313355。
解答:由於題目涉及到整數的連線,如果直接進行整數的連線,可能會超出整數的表示範圍,因此我們將之轉換為字串之間的連線更簡單些,同時自定義字串的比較規則:如果字串a+b > b+a,那麼a>b
。同時可以證明a+b>=b+a,b+c>=c+b,則a+c>=c+a。
因此,解題思路為:1)先將輸入的n個整數轉換成字串;2)按照自定義的字串比較規則將n個字串排序;3)最後按照從小到大的順序輸出字串,即實現連線成最小的整數。
**如下:
#include
#include
#include
class
ascenum
//過載'<'操作符
bool
operator
<(
const
ascenum &other)
const
//下面就是我們的自定義字串比較規則額
std::string right = str + other.str;
std::string left = other.str + str; if
(right >= left)
//相等時算是false
return
false;
else
if(right < left)
return
true;
} const
char
* getstr()
const
private:
std::string str; };
void
asceout(
int*target,
intlen)
//按順序輸出,就可以實現組成乙個最小的多位數
//如果反向輸出則是乙個最大的多位數
for(std::set::iterator it = ascestrings.begin(); it != ascestrings.end(); it++)
std::cout< }
intmain() ;
inttestcase2 = ;
asceout(testcase1, 3);
asceout(testcase2, 6);
system(
"pause");
return
0; }
《演算法之美》 n個數連線得到最小的多位整數
題目 設有n個正整數,將它們連線成一排,組成乙個最小的多位整數?例如 n 2時,2個整數32,321連線成的最小整數是 32132 n 4時,4個整數55,31,312,33連線成的最小整數為 312313355。解答 由於題目涉及到整數的連線,如果直接進行整數的連線,可能會超出整數的表示範圍,因此...
貪心演算法 n個數連線得到最小或最大的多位整數
設有n個正整數,將他們連線成一排,組成乙個最大的多位整數。例如 n 3時,3個整數13,312,343,連成的最大整數為 34331213 又如 n 4時,4個整數7,13,4,246連線成的最大整數為7424613 輸入 n n個數輸出 連線成的多位數 演算法分析 此題很容易想到使用貪心法,在考試...
字串排序 n個數連線得到最小或最大的多位整數
描述 設有n個正整數,將它們依次連成在一排,組成乙個多位數,現在要求可能組成的多位數中最大的多位數是什麼?例如 n 3時,3個整數13,312,343連成的最大多位數為 343 312 13。例如 n 4時,4個證書7,13,4,246連成的最大多位數為 7 4 246 13。輸入 n個整數,eof...