zoukankan      html  css  js  c++  java
  • I00021 有负数项的数列之和

    问题:编写函数计算数列前n项之和,数列为1-2+3-4+5-6+7-8+......。

    这个问题简单,编写一个计算数列之和的函数太容易了。

    人们通常用计算解决问题,也就是编写程序解决问题。然而,编写程序解决问题,是多解的,即不同的程序可以计算出相同的结果。

    解决这个问题,编写了3个不同的函数。

    函数sum1(),遇到正数项则相加,遇到负数项则相减,使用逻辑判定来决定是做相加还是相减,即对于奇数项做加法计算,对于偶数项做减法计算。

    函数sum2(),也是用一般累加求和的计算,对于每一项进行求和计算。其中使用了一个小技巧,用变量sign来控制项的正负。语句sign = -sign;每一次执行后,如果sign原先是1则变为-1,如果sign原先是-1则变为1。再通过乘法运算来改变一个数的符号。这种小技巧,许多地方都有可能使用,平时需要积累。

    函数sum3(),则在对数列计算公式进行推导之后再进行计算,计算量是最小的。数列从小到大,两项两项相加都是-1,所以如果给定的n是为偶数时,其值为-n/2;若给定的n为奇数时,其值为前你项之和加上第n项,即-(n-1)/2+n。这个函数的计算效率是最高的。

    源程序如下:

    /* 编写函数计算数列前n项之和,数列为1-2+3-4+5-6+7-8+......。 */
    
    #include <stdio.h>
    
    /* 判断奇偶进行相加或相减计算,最后算出数列之和 */
    long sum1(int n)
    {
        long sum = 0;
        int i;
    
        for(i=1; i<=n; i++) {
            if(i % 2 == 1)
                sum += i;
            else
                sum -= i;
        }
    
        return sum;
    }
    
    /* 使用1和-1来乘,实现负数求和计算 */
    long sum2(int n)
    {
        long sum = 0;
        int i, sign=1;
    
        for(i=1; i<=n; i++) {
            sum += sign * i;
    
            sign = -sign;       // 每执行一次,1变-1,或-1变1
        }
    
        return sum;
    }
    
    /* 先进行数学推导,再用程序实现计算 */
    long sum3(int n)
    {
        if(n % 2 == 1)
            return - (n-1) / 2 + n;
        else
            return - n / 2;
    }
    
    int main(void)
    {
        int i;
    
        for(i=1; i<=20; i++)
            printf("%d %ld %ld %ld
    ", i, sum1(i), sum2(i), sum3(i));
    
        return 0;
    }

    测试计算结果(计算到前20项之和为止)如下:

    1 1 1 1
    2 -1 -1 -1
    3 2 2 2
    4 -2 -2 -2
    5 3 3 3
    6 -3 -3 -3
    7 4 4 4
    8 -4 -4 -4
    9 5 5 5
    10 -5 -5 -5
    11 6 6 6
    12 -6 -6 -6
    13 7 7 7
    14 -7 -7 -7
    15 8 8 8
    16 -8 -8 -8
    17 9 9 9
    18 -9 -9 -9
    19 10 10 10
    20 -10 -10 -10

  • 相关阅读:
    YUM安装(卸载)KDE和GNOME
    shutdown
    linux运行级别
    [root@localhost ~]#各项解释
    常用服务端口号
    部分命令技巧
    网卡配置文件
    《移动端支付系统如何设计有效地防重失效机制?》阅读心得
    软件开发第三天(记录)
    软件开发第二天(记录)
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564781.html
Copyright © 2011-2022 走看看