/*******************************************************************
Copyright(c) 2016, Tyrone Li
All rights reserved.
*******************************************************************/
// 作者:TyroneLi
//
/*
Q:
把数组排成最小的数:
输入一个正整数数组,把数组里面所有的数字拼接起来排成一个数,打印能拼接的所有数字最小的一个。
S:
定义一种组合的规则,对于m和n两个数,如果mn>nm,那么m>n;如果mn<nm,那么m<n;否则m=n。
然后由于数字的拼接可能会导致大数问题,这里采用字符串的方式去做。
*/
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
const int g_MaxNumberLength = 10;
char*g_StrCombine1 = new char[g_MaxNumberLength + 1];
char*g_StrCombine2 = new char[g_MaxNumberLength + 1];
int compare(const void*str1, const void*str2)
{
strcpy(g_StrCombine1, *(const char**)str1);
strcat(g_StrCombine1, *(const char**)str2);
strcpy(g_StrCombine2, *(const char**)str2);
strcat(g_StrCombine2, *(const char**)str1);
return strcmp(g_StrCombine1, g_StrCombine2);
}
int compare_max(const void*str1, const void*str2)
{
strcpy(g_StrCombine1, *(const char**)str1);
strcat(g_StrCombine1, *(const char**)str2);
strcpy(g_StrCombine2, *(const char**)str2);
strcat(g_StrCombine2, *(const char**)str1);
return strcmp(g_StrCombine2, g_StrCombine1);
}
void printMinNUmber(int*number, int length)
{
if(number == nullptr || length <= 0)
return;
char**strBums = (char**) (new int[length]);
for(int i = 0; i < length; ++i)
{
strBums[i] = new char[g_MaxNumberLength + 1];
sprintf(strBums[i], "%d", number[i]);
}
qsort(strBums, length, sizeof(char*), compare);
for(int i = 0; i < length; ++i)
std::cout << strBums[i];
std::cout << std::endl;
for(int i = 0; i < length; ++i)
delete[] strBums[i];
delete[] strBums;
}
void printMaxNUmber(int*number, int length)
{
if(number == nullptr || length <= 0)
return;
char**strBums = (char**) (new int[length]);
for(int i = 0; i < length; ++i)
{
strBums[i] = new char[g_MaxNumberLength + 1];
sprintf(strBums[i], "%d", number[i]);
}
qsort(strBums, length, sizeof(char*), compare_max);
for(int i = 0; i < length; ++i)
std::cout << strBums[i];
std::cout << std::endl;
for(int i = 0; i < length; ++i)
delete[] strBums[i];
delete[] strBums;
}
void test_1()
{
std::cout << "Test 1" << std::endl;
int num[] = {3, 32, 321};
for(auto e:num)
std::cout << e << " ";
std::cout << std::endl;
printMinNUmber(num, 3);
printMaxNUmber(num, 3);
}
void test_2()
{
std::cout << "Test 2" << std::endl;
int num[] = {3, 3, 321};
for(auto e:num)
std::cout << e << " ";
std::cout << std::endl;
printMinNUmber(num, 3);
printMaxNUmber(num, 3);
}
void test_3()
{
std::cout << "Test 3" << std::endl;
int num[] = {3};
for(auto e:num)
std::cout << e << " ";
std::cout << std::endl;
printMinNUmber(num, 1);
printMaxNUmber(num, 1);
}
void test_4()
{
std::cout << "Test 4" << std::endl;
int*num = nullptr;
// for(auto e:num)
// std::cout << e << " ";
// std::cout << std::endl;
printMinNUmber(num, 0);
printMaxNUmber(num, 0);
}
void test_5()
{
std::cout << "Test 5" << std::endl;
int num[] = {1,2,3,};
for(auto e:num)
std::cout << e << " ";
std::cout << std::endl;
printMinNUmber(num, 3);
printMaxNUmber(num, 3);
}
void test_printMinNUmber()
{
test_1();
test_2();
test_3();
test_4();
test_5();
}
int main(int argc, char**argv)
{
test_printMinNUmber();
return 0;
}