小程序学习:整数各位数字重新排列为最小的数

要求:

输入整数范围:-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 }

 

posted @ 2017-08-26 01:50  扬帆入海  阅读(396)  评论(0编辑  收藏  举报