zoukankan      html  css  js  c++  java
  • 数据分离与结合算法之倒序输出

     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
    ", 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("
    ");
    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
    ",final_num);
        return 0;
    }

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

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

  • 相关阅读:
    113. Path Sum II
    112. Path Sum
    111. Minimum Depth of Binary Tree
    110. Balanced Binary Tree
    Create
    SetWindowPos
    INT_PTR数据类型
    SDK介绍
    COLORREF
    setfont()函数
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/6544514.html
Copyright © 2011-2022 走看看