68.把陣列排成最小的數(陣列、演算法)。
題目:輸入乙個正整數陣列,將它們連線起來排成乙個數,輸出能排出的所有數字中最小的乙個。
例如輸入陣列,則輸出這兩個能排成的最小數字 32132。
請給出解決問題的演算法,並證明該演算法。
思路:首先,肯定要考慮溢位問題。開始想用字串,後來改為了用list。思路是先把第乙個數字放入list,然後依次把後面的數字插入到合適的位置。
關鍵問題就是如何判斷兩個數字哪乙個在前面。
①對於 353 、412這樣的情況,肯定是第乙個數字小的在前面
②遇到數字相同的就比較下乙個數字
③那像 3、 32 這樣的情況,兩個數字前面相同後面不一樣長的 把長的數字去掉相同的部分再跟短的數字比
如 3 、3332
3、332
3、32
3、2 後面的數字放前面
再如 321321321、321
321321、321
321、321 相等 哪個放在前面都一樣
為了獲取數字的每一位方便,有定義了乙個結構,存放每個數字各個位上的數,以及位數的大小。整體**如下:
/*68.把陣列排成最小的數(陣列、演算法)。
題目:輸入乙個正整數陣列,將它們連線起來排成乙個數,輸出能排出的所有數字中最小的乙個。
例如輸入陣列,則輸出這兩個能排成的最小數字 32132。
請給出解決問題的演算法,並證明該演算法。
start to code = 18:42
end time = 19:47
*/#include
#include
using
namespace
std;
typedef
struct
seperatenum
seperatenum;
seperatenum getseperatenum(
intn)
if (s.len == 0) //
只有乙個數字0的情況
returns;}
bool isbefore(seperatenum a, int na, seperatenum b, int nb) //
a 是否應該放在 b前面 n為當前判斷第幾個數字
else
if (b.len - nb < 0 && a.len - na >= 0) //
b數字比較短 且b與a的前面都相等
else
if(b.len - nb >= 0 && a.len - na < 0) //
a數字比較短
if (a.num[a.len - na] > b.num[b.len -nb])
else
if (a.num[a.len - na] < b.num[b.len -nb])
else
//本位數字相等判斷下一位
}void getminnum(int * in, int len) //
輸入陣列 和 長度
}if (isinsert == false) //
沒有在中間插入 插在最後面
}cout
<< "
組合成的最小數字是:";
for(it = lminnum.begin(); it != lminnum.end(); it++) //
輸出最小的數字 注意判斷結束要用 『 != 』 不能用『 < 』
}cout
<}int
main()
; getminnum(a, 4);
return0;
}
查到了乙個講c++不錯的**
整整寫了100多行,用到了自定義結構、stl、遞迴各種複雜的東西。用了1個多小時,還不包括思考的時間。
在網上找答案,發現人家的答案都好簡潔啊。
經驗證這裡的答案正確 裡面還附有證明
方法相當的簡單,我怎麼就沒有想到。 就是把兩個數a、b 正反都拼一下 ab、ba 比較一下那個數小就行了。
**裡面直接用了strcmp來做這個。
#include #includeusing
namespace
std;
const
int g_maxnumberlength=10
;char* g_strcombine1=new
char[g_maxnumberlength*2+1
];char* g_strcombine2=new
char[g_maxnumberlength*2+1
];int compare(const
void* strnumber1, const
void*strnumber2)
void printminnumber(int *numbers, int
length)
qsort(strnumbers, length,
sizeof(char*), compare);
for(int i=0; i)
cout
delete strnumbers[i];
delete strnumbers;
}void
main()
另乙個實現:
#include #include#include
#include
using
namespace
std;
bool compare(const
string& str1, const
string &str2)
void comarraymin(int *parray, int
num)
sort(pstrarray, pstrarray+num, compare);
for(i=0; i)
cout
}void
main()
程式設計題目 把陣列排成最小的數
68.把陣列排成最小的數 陣列 演算法 題目 輸入乙個正整數陣列,將它們連線起來排成乙個數,輸出能排出的所有數字中最小的乙個。例如輸入陣列,則輸出這兩個能排成的最小數字 32132。請給出解決問題的演算法,並證明該演算法。思路 首先,肯定要考慮溢位問題。開始想用字串,後來改為了用list。思路是先把...
題目1504 把陣列排成最小的數
題目描述 輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。輸入 輸入可能包含多個測試樣例。對於每個測試案例,輸入的第一行為乙個整數m 1 m 100 代表輸入的正整數的個數。輸入的第二行包括m...
演算法題目 把陣列排成最小的數
輸入乙個正整數陣列,陣列裡面所有數字拼接起來排成乙個數,列印能拼接出的所有數字最小的乙個。例如輸入陣列 3,32,321 則列印出最小數字321323 const int g maxnumberlength 10 char g strcombine1 new char g maxnumberleng...