数据分离与结合算法之倒序输出

 1 #define _CRT_SECURE_NO_WARNINGS//vs编译器去除scanf的警告
 2 #include<stdio.h>
 3 //倒叙输出,输入12345,输出54321,输入的位数不定
 4 int get_digit(int digit);
 5 int getlg_n(int n);
 6 int final_operate(int num, int wei);
 7 int main(void)
 8 {
 9     int num;
10     scanf("%d", &num);
11     int wei=get_digit(num);
12     printf("%d\n", final_operate(num, wei));
13     return 0;
14 }
15 /*得到输入数字的位数*/
16 int get_digit(int digit)
17 {
18     int bit_cout = 0;
19     while (digit)
20     {
21         bit_cout++;
22         digit /= 10;
23     }
24     return bit_cout;
25 }
26 /*得到10的几次方*/
27 int getlg_n(int n)
28 {
29     int res = 1;
30     for (int i = 0; i < n; i++)
31     {
32         res *= 10;
33     }
34     return res;
35 }
36 /*完成算法
37 num:输入的数字
38 wei:求得的位数
39 return:最终的翻转数字
40 */
41 int final_operate(int num,int wei)
42 {
43     int turn_bit = 0, final_num = 0;
44     for (int i = 0; i < wei; i++)
45     {
46         turn_bit = num % 10;//得到最后一位
47         num /= 10;//为了得到每个数字做的约束
48         final_num += turn_bit*getlg_n(wei - 1 - i);//思考为什么要wei-1-i
49                                                 //其实属于小学找规律的题
50     }
51     return final_num;
52 }

上面的算法可以达到目的,备注也比较清晰了,但这属于基础级。

我们要翻转,首先要数据分离,求得输入数字的位数,求输入数字位数就是一个简单的分离,而我们要想使用最后的数据,又需要结合。

下面展示一个同样达到效果的程序,出自GF之手(^(* ̄(oo) ̄)^);

 1 #include<stdio.h>  
 2 int main()
 3 {
 4     int n;
 5     scanf("%d", &n);
 6     while (n) {
 7         printf("%d", n % 10);
 8         n /= 10;
 9     }
10     printf("\n");
11     return 0;
12 }

这份代码非常简洁的完成了要求,倒序输出,但却是毫无意义的。

第一,这个只是单纯的输出,没有真正可利用的数据,只有分离没有结合;

第二,写了这个代码之后,以后需要类似代码还是得重新写,比如我需要倒序之后加10.1输出;

第三,复用性不够,也就是第二点提出的问题,我们需要写出一个算法之后,在以后的代码开发过程中可以复用,所以应该把他们封装成函数接口供以调用。。。

 

数学高手些的实现方法:

 

#define _CRT_SECURE_NO_WARNINGS//vs编译器去除scanf的警告

#include<stdio.h>  
int main()
{
    int n;
    scanf("%d", &n);
    int final_num = 0,wei;
    while (n) 
    {
        final_num *= 10;//循环乘10,为了实现后面的加法得到最终结果
        wei = n % 10;//取最后一位
        final_num += wei;//每次循环都需要乘以10再加上来,也就是把分离的过程提到一步完成
        n /= 10;
    }
    printf("%d\n",final_num);
    return 0;
}

 

这个需要一定的数学思维,分析算法并有自己的设计思想。

算法,是一步步锻炼起来的。

 

posted @ 2017-03-13 19:08  Crystal_Guang  阅读(432)  评论(0编辑  收藏  举报