I00021 有负数项的数列之和
来源:互联网 发布:系统升级软件 编辑:程序博客网 时间:2024/04/27 16:24
问题:编写函数计算数列前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\n", 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
- I00021 有负数项的数列之和
- 有一个分数数列2/1,3/2,5/3,8/5,。。。。。求出这个数列的前20项之和
- 有一个分数序列,求出这个数列的前20项之和
- 数列的前N项之和
- 题目:有一分数数列,2/1,3/2,5/3,8/5,13/8,21/13,,求出这个数列的前20项之和。
- 找规律求和:有一分数列:2/1、3/2、5/3、8/5、13/8、21/13......求出这个数列的前20项之和。
- 算法题-数列的前n项之和及扩展
- 求一个不含0的数列(可以有正数和负数)的最大子序列乘积java
- 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
- java经典算法_018有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
- 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
- 有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13...... 求出这个数列的前N项之和,保留两位小数。
- 有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13...... 求出这个数列的前N项之和,保留两位小数。
- C100-24 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
- 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
- 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
- 5.有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
- 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和
- join连接的五种方式的简单使用案例(Inner join,Left join,Right join,Full join,Cross join)
- Java界面开发——登录并对用户身份进行验证
- 将输入流读取成String后返回
- java基础之网络编程
- Word Pattern
- I00021 有负数项的数列之和
- java打字母的小游戏
- 生日快乐
- ubuntu查看系统资源占用(内存,cpu和进程)
- Android学习中出现的错误以及解决
- bootstrap alert提示框的bug
- 服务的升级和降级
- 软链接和硬链接详解
- My_Head_File