zoukankan      html  css  js  c++  java
  • 《C语言及程序设计》实践參考——分数的累加

    返回:贺老师课程教学链接  项目要求



    【项目1:分数的累加】
    编程序。输出1/3-3/5+5/7-7/9…+19/21的结果
    提示:假设直接解决上面的问题有困难。能够设计一条“由易到难”的路线,逐渐解决当中要解决的问题,让自己的思路明朗起来。
    (1)1+2+...+20  ——这个应该会
    (2)1+1/2+1/3+…+1/20  ——分数的累加,注意两个整型相除。商也为整型。而显然求和结果应该是小数
    (3)1/2+2/3+3/4+…+19/20  ——分子不全是1了,找找规律。稍加修改就好了
    (4)1/2-2/3+3/4-…+19/20   ——要累加的值一正一负倒腾,用pow(-1,i)是个效率非常低的做法,不推荐使用。

    技巧:专门设置一个变量s表示累加项的符号,取值随着循环,每次乘以-1。从而在+1、-1之间变化。循环加求和的累加要用累加的项(i/(i+1))乘以这个表示符号的s。
    (5)1/3-3/5+5/7-7/9…+19/21  ——这是我们的目标。

    品品这样的思路。一口吃不成胖子,学会一口一口吃饭。用心编程,再大的障碍,也会一个一个地排除。


    [參考解答]

    (1)1+2+...+20  ——这个应该会

    //用for循环完毕,其它循环自行完毕
    #include <stdio.h>
    int main( )
    {
        int sum=0,i;
        for(i=1; i<=20; ++i)
            sum+=i;
        printf("%f
    ", sum);
        return 0;
    }


    (2)1+1/2+1/3+…+1/20  ——分数的累加,注意两个整型相除,商也为整型。而显然求和结果应该是小数
    //用for循环完毕,其它循环自行完毕
    #include <stdio.h>
    int main( )
    {
        int i;
        double sum=0;  //注意结果将为小数
        for(i=1; i<=20; ++i)
            sum=sum+1.0/i; //注意是1.0/i,而不能是1/i
        printf("%f
    ", sum);
        return 0;
    }


    (3)1/2+2/3+3/4+…+19/20  ——分子不全是1了,该找找规律了。也不是从1開始加了
    #include <stdio.h>
    int main( )
    {
        int i;
        double sum=0;
        for(i=2; i<=20; ++i)
            sum=sum+(double)(i-1)/i; //注意是(double)(i-1)/i;,而不能是(i-1)/i
        printf("%f
    ", sum);
        return 0;
    }


    (4)1/2-2/3+3/4-…+19/20   ——要累加的值一正一负倒腾。用pow(-1,i)是个效率非常低的做法,不推荐使用。技巧:专门设置一个变量s表示累加项的符号,取值随着循环,每次乘以-1,从而在+1、-1之间变化,循环加求和的累加要用累加的项(i/(i+1))乘以这个表示符号的s。
    #include <stdio.h>
    int main( )
    {
        int i,s=1;
        double sum=0;
        for(i=2; i<=20; ++i)
        {
            sum=sum+s*(double)(i-1)/i; //用s乘以被加的分数,考虑了待加项的符号
            s=-s;    //-是一目的负号运算符,获得s的相反数,以此将循环中在+1和-1间交替
        }
        printf("%f
    ", sum);
        return 0;
    }


    思考:将循环体内的两条语句换一下会如何?一定要换,须要进行如何的调整?


    (5)1/3-3/5+5/7-7/9…+19/21  ——这是我们的目标。品品这样的思路。一口吃不成胖子,学会一口一口吃饭。用心编程,再大的障碍,也会一个一个地排除。


    #include <stdio.h>
    int main( )
    {
        int i,s=1;
        double sum=0;
        for(i=1; i<=10; ++i) //i和以下加数是相关的
        {
            sum=sum+s*(double)(2*i-1)/(2*i+1); //按循环变量变化规律。相邻的两个奇数将相除
            s=-s;
        }
        printf("%f
    ", sum);
        return 0;
    }




    思考:假设for循环这样写,程序该如何改?
    #include <stdio.h>
    int main( )
    {
        int i,s=1;
        double sum=0;
        for(i=1; i<=19; i+=2)
        {
            sum=sum+s*____________________; //使相邻的两个奇数将相除
            s=-s;
        }
        printf("%f
    ", sum);
        return 0;
    }



  • 相关阅读:
    【BZOJ 2124】【CodeVS 1283】等差子序列
    【BZOJ 1036】【ZJOI 2008】树的统计Count
    【BZOJ 1901】【ZJU 2112】Dynamic Rankings
    【BZOJ 3924】【ZJOI 2015】幻想乡战略游戏
    【BZOJ 4103】【THUSC 2015】异或运算
    【BZOJ 4513】【SDOI 2016】储能表
    【HDU 3622】Bomb Game
    【BZOJ 3166】【HEOI 2013】Alo
    【BZOJ 3530】【SDOI 2014】数数
    【BZOJ 4567】【SCOI 2016】背单词
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7277947.html
Copyright © 2011-2022 走看看