题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。
举例:输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。
答:算法如下,证明略。
答:
#include "stdafx.h" #include <iostream> #include <string> #include <sstream> using namespace std; //把int转化为string string int2str(int i) { string s; stringstream ss(s); ss << i; return ss.str(); } int cmp(const void *one,const void *two) { string strone = *(string*)one; string strtwo= *(string*)two; string stronetwo = strone + strtwo; string strtwoone = strtwo + strone; return stronetwo > strtwoone; } int _tmain(int argc, _TCHAR* argv[]) { int arr[] = {323, 324, 777, 432, 876, 565, 9, 228}; int length = sizeof(arr)/sizeof(arr[0]); string *str = new string[length]; for (int i = 0; i < length; i++) { str[i] = int2str(arr[i]); } qsort(str, length, sizeof(str[0]), cmp); for (int i = 0; i < length; i++) { cout<<str[i]; } delete [] str; cout<<endl; return 0; }
运行界面如下: