• LQ0195 史丰收速算【程序填空】


    题目来源:蓝桥杯2014初赛 C++ A组D题

    题目描述
    本题为代码补全填空题,请将题目中给出的源代码补全,并复制到右侧代码框中,选择对应的编译语言(C/Java)后进行提交。若题目中给出的源代码语言不唯一,则只需选择其一进行补全提交即可。复制后需将源代码中填空部分的下划线删掉,填上你的答案。提交后若未能通过,除考虑填空部分出错外,还需注意是否因在复制后有改动非填空部分产生错误。

    史丰收速算法的革命性贡献是:从高位算起,预测进位。不需要九九表,彻底颠覆了传统手算!

    速算的核心基础是:1 位数乘以多位数的乘法。

    其中,乘以 7 是最复杂的,就以它为例。

    因为,1/7 是个循环小数:0.142857…,如果多位数超过 142857…,就要进 1。

    同理,2/7, 3/7, … 6/7 也都是类似的循环小数,多位数超过 nn/7,就要进 nn。

    下面的程序模拟了史丰收速算法中乘以7的运算过程。

    乘以 7 的个位规律是:偶数乘以 2,奇数乘以 2 再加 5,都只取个位。

    乘以 7 的进位规律是:

    满 142857... 进 1,
    满 285714... 进 2,
    满 428571... 进 3,
    满 571428... 进 4,
    满 714285... 进 5,
    满 857142... 进 6。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    请分析程序流程,填写划线部分缺少的代码。

    C

    #include 
    #include 
    // 模拟 史丰收速算法 多位数乘以 7 的计算过程
    //计算个位 
    int ge_wei(int a)
    {
        if(a % 2 == 0)
            return (a * 2) % 10;
        else
            return (a * 2 + 5) % 10;    
    }
    
    //计算进位 
    int jin_wei(int a, char* p)
    {
        char* level[] = {
            "142857",
            "285714",
            "428571",
            "571428",
            "714285",
            "857142"
        };
        
        char buf[7];
        buf[6] = '\0';
        strncpy(buf,p,6);
        
        int i;
        for(i=5; i>=0; i--){
            int r = strcmp(level[i], buf);
            if(r<0) return i+1;
            while(r==0){
                p += 6;
                strncpy(buf,p,6);
                r = strcmp(level[i], buf);
                if(r<0) return i+1;
                _________________________;
            }
        }
        
        return 0;
    }
    
    //多位数乘以7
    void f(char* s) 
    {
        int head = jin_wei(0,s);
        if(head > 0) printf("%d", head);
        
        char* p = s;
        while(*p){
            int a = (*p-'0');
            int x = (ge_wei(a) + jin_wei(a,p+1)) % 10;
            printf("%d",x);
            p++;
        }
        
        printf("\n");
    }
    
    int main()
    {
        f("1847255097268459");
        f("1428571428571");
        f("1428571428572");
        f("4285714285714286");        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69

    问题分析
    填入“if(r>0)return i”

    AC的C语言程序如下:

    #include 
    #include 
    // 模拟 史丰收速算法 多位数乘以 7 的计算过程
    //计算个位 
    int ge_wei(int a)
    {
        if(a % 2 == 0)
            return (a * 2) % 10;
        else
            return (a * 2 + 5) % 10;    
    }
    
    //计算进位 
    int jin_wei(int a, char* p)
    {
        char* level[] = {
            "142857",
            "285714",
            "428571",
            "571428",
            "714285",
            "857142"
        };
        
        char buf[7];
        buf[6] = '\0';
        strncpy(buf,p,6);
        
        int i;
        for(i=5; i>=0; i--){
            int r = strcmp(level[i], buf);
            if(r<0) return i+1;
            while(r==0){
                p += 6;
                strncpy(buf,p,6);
                r = strcmp(level[i], buf);
                if(r<0) return i+1;
                if(r>0)return i;
            }
        }
        
        return 0;
    }
    
    //多位数乘以7
    void f(char* s) 
    {
        int head = jin_wei(0,s);
        if(head > 0) printf("%d", head);
        
        char* p = s;
        while(*p){
            int a = (*p-'0');
            int x = (ge_wei(a) + jin_wei(a,p+1)) % 10;
            printf("%d",x);
            p++;
        }
        
        printf("\n");
    }
    
    int main()
    {
        f("1847255097268459");
        f("1428571428571");
        f("1428571428572");
        f("4285714285714286");        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
  • 相关阅读:
    股票价格预测 | Python基于RNN及股票预测实战
    Css定位
    从0开始编写BP,自适应学习率的BP神经网络,不使用MATLAB工具箱,纯手写matlab代码,以BP分类为例...
    【ZooKeeper】zookeeper源码2-持久化机制
    【MindSpore易点通】如何迁移PyTorch代码并在Ascend上实现单机单卡训练
    JAVA项目-windows测试环境搭建
    基于SAE堆叠自编码器的单维时间序列预测研究(matlab代码实现)
    导师详解:多比特信号的CDC处理方式之异步FIFO
    【Leetcode HOT100】不同路径 c++
    Redisson 的主要方法
  • 原文地址:https://blog.csdn.net/tigerisland45/article/details/127868937