问题描述:例如,给定[50,2,1,9],最大数字为95021
问题分析:将输入的数字进行排列组合,使得最终得到的整数是最大的
以前者位数大于后者位数为例进行分析
if (Divide(MyStruct[i].x, 1, 1) > Divide(MyStruct[i + 1].x, 1, 1)) { if (Divide(MyStruct[i].x, Divide(MyStruct[i + 1].x, 1, 1), 0) < MyStruct[i + 1].x) temp_struct = MyStruct[i], MyStruct[i] = MyStruct[i + 1], MyStruct[i + 1] = temp_struct; else if (Divide(MyStruct[i].x, Divide(MyStruct[i + 1].x, 1, 1), 0) == MyStruct[i + 1].x) { if (MyStruct[i + 1].x * 10 + Divide(MyStruct[i].x, 1, 0) > Divide(MyStruct[i].x, (Divide(MyStruct[i + 1].x, 1, 1)) + 1, 0)) temp_struct = MyStruct[i], MyStruct[i] = MyStruct[i + 1], MyStruct[i + 1] = temp_struct; } } Divide(MyStruct[i].x, 1, 1) 引用Divide(int x,int y,int z)函数。传入当前数字MyStruct[i].x,需要判断位数为1位,z=1。说明需要返回MyStruct[i].x数字的位数。 if (Divide(MyStruct[i].x, Divide(MyStruct[i + 1].x, 1, 1), 0) < MyStruct[i + 1].x) 这里是将位数较多的那一个数字选取与位数较小的数字的位数与位数较小的数字进行比较。列如:779与78比较。Divide(MyStruct[i].x, Divide(MyStruct[i + 1].x, 1, 1)返回77,MyStruct[i + 1].x为78 temp_struct = MyStruct[i], MyStruct[i] = MyStruct[i + 1], MyStruct[i + 1] = temp_struct; 这里是两个结构体变量的交换 else if (Divide(MyStruct[i].x, Divide(MyStruct[i + 1].x, 1, 1), 0) == MyStruct[i + 1].x) { if (MyStruct[i + 1].x * 10 + Divide(MyStruct[i].x, 1, 0) > Divide(MyStruct[i].x, (Divide(MyStruct[i + 1].x, 1, 1)) + 1, 0)) temp_struct = MyStruct[i], MyStruct[i] = MyStruct[i + 1], MyStruct[i + 1] = temp_struct; } 当两个返回值相同时怎么办?比如:778和77 if (MyStruct[i + 1].x * 10 + Divide(MyStruct[i].x, 1, 0) > Divide(MyStruct[i].x, (Divide(MyStruct[i + 1].x, 1, 1)) + 1, 0)) 这条语句即是精华部分。意思是:将77*10得到770再加上778的首位7,得到777,然后与778比较。 /*处理函数*/ void Operate() { for (int i = 0; i < number; i++) { MyStruct[i].y = Divide(num[i], 1, 0); } for (int j = 0; j < number - 1; j++) { for (int i = 0; i < number - 1 - j; i++) { if (MyStruct[i].y < MyStruct[i + 1].y) temp_struct = MyStruct[i], MyStruct[i] = MyStruct[i + 1], MyStruct[i + 1] = temp_struct; } } for (int i = 0; i < number;) { int get = MyStruct[i].y, xx = i; while (MyStruct[i].y == get) i++; int yy = i - 1; Piece(xx, yy); } } 这个函数的目的是得到不同数字的首位,并从大到小排序,并针对相同首位进行分片,并传入Piece() for (int i = 0; i < number; i++) { MyStruct[i].y = Divide(num[i], 1, 0); } 调用Divide函数,将预处理的数组num中的数字的首位保存到MyStruct[i].y里面。 for (int j = 0; j < number - 1; j++) { for (int i = 0; i < number - 1 - j; i++) { if (MyStruct[i].y < MyStruct[i + 1].y) temp_struct = MyStruct[i], MyStruct[i] = MyStruct[i + 1], MyStruct[i + 1] = temp_struct; } } 这里用到了冒泡排序,将首位数字从大到小排序 for (int i = 0; i < number;) { int get = MyStruct[i].y, xx = i; while (MyStruct[i].y == get) i++; int yy = i - 1; Piece(xx, yy); } 将同一片的数据首尾下标传入Piece中处理。 void Print() { for (int i = 0; i < number; i++) printf("%d ", MyStruct[i].x); printf("\n---------------------------------------------\n"); } 打印函数 int main() { for (int i = 0; i < 100 ; i++) { Random(); Operate(); Print(); number = 0; } return 0; } 主函数。这里要注意,如果使用随机生成方式。number=0语句很重要。