要求:
输入整数范围:-10^5 <= key <= 10^5
输出:整数各位数字重新排列后,能得到的最小数。
例如:输入-70303,输出-73300。
(说明:以下仅为个人实现方法,必然不是最优实现方法,也可能存在问题,原始目的仅是供女朋友学习参考。如果各位童鞋有更好的方法,请留言,大家多多交流,共同提高。)
思路:
(1)分离整数的各位数字存放在数组中;
(2)数字升序排序;
(3)排序后,将最小的且不为0的数与数组中的最小数交换;
(4)将数组合并为新的整数。
运行程序方法:
Linux生成的可执行程序为a.out,请在a.out所在目录下,运行命令: $ ./a.out -70303
Windows如果生成的可执行程序为test.exe,请在test.exe所在目录下,运行命令: $ test.exe -70303
(说明:想更换整数输入,仅需将-70303更换为想输入的整数即可。)
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define N 6 //规定输入整数最多位数 5 6 void swap(int *x, int *y) 7 { 8 int temp = *x; 9 *x = *y; 10 *y = temp; 11 } 12 13 void bubbleSort(int *arr, int len) 14 { 15 int i, j; 16 for(i = 1; i < len; ++i) 17 for(j = 0; j < len - i; ++j) 18 if(arr[j] > arr[j + 1]) 19 swap(arr + j, arr + j + 1); 20 } 21 22 int split(long val, int *num) 23 { 24 int i; 25 for(i = 0; i < N; ++i){ 26 num[i] = val % 10; 27 val = val / 10; 28 if(val == 0) 29 return i + 1; 30 } 31 return i; 32 } 33 34 int merge(int *num, int len) 35 { 36 long result = 0; 37 int i; 38 for(i = 0; i < len; ++i) 39 result = result * 10 + num[i]; 40 return result; 41 } 42 43 long lockingKey(long val) 44 { 45 int num[N]; 46 int i; 47 int count = split(val, num); 48 bubbleSort(num, count); 49 for(i = 0; i < count; ++i){ 50 if(num[i] != 0){ 51 swap(num, num + i); 52 break; 53 } 54 } 55 return merge(num, count); 56 } 57 58 int main(int argc, char **argv) 59 { 60 printf("%ld\n", lockingKey(atol(argv[1]))); 61 return 0; 62 }