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;
    }

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

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

  • 相关阅读:
    解释机器学习模型的一些方法(一)——数据可视化
    机器学习模型解释工具-Lime
    Hive SQL 语法学习与实践
    LeetCode 198. 打家劫舍(House Robber)LeetCode 213. 打家劫舍 II(House Robber II)
    LeetCode 148. 排序链表(Sort List)
    LeetCode 18. 四数之和(4Sum)
    LeetCode 12. 整数转罗马数字(Integer to Roman)
    LeetCode 31. 下一个排列(Next Permutation)
    LeetCode 168. Excel表列名称(Excel Sheet Column Title)
    论FPGA建模,与面向对象编程的相似性
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/6544514.html
Copyright © 2011-2022 走看看