题目标题:求给定精度的简单交错序列部分和 题目作者:C课程组 浙江大学
本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps。
输入格式:
输入在一行中给出一个正实数eps。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范围。
输入样例1:
4E-2
输出样例1:
sum = 0.854457
输入样例2:
0.02
输出样例2:
sum = 0.826310
思路:用迭代的思想考虑,初始化i=1,sign=1;每次把sign/i加到sum上,之后进行迭代:i += 3 和 sign = -sign;当最后一项的绝对值,即1.0/i小于等于给定的精度时,把这项加给sum,然后跳出。
注意:每次加给sum的项的绝对值是单调递减的,一开始一般都是会大于给定的精度eps。注意理解"直到最后一项的绝对值不大于给定的精度eps"这一句的含义,是指遇到一项,这项的绝对值小于等于给定的精度eps,把这一项加上的,然后再跳出。
如果用while (1.0/i >=eps) 来进行循环,会出现这种情况:就是当循环跳出前给sum加上的最后一项的绝对值>eps,循环跳出时的i,满足1.0/i的绝对值小于eps。根据题意,这此时的sign/i这一项应该被加到sum上,然而却没有。
所以,我们在循环体里,根据本次循环所加上的项的绝对值的大小,来决定是否调用break语句进行跳出即可。
代码:
#include <stdio.h>
int main () {
int i=1;
double d, sum=0, sign=1;
scanf("%lf", &d); // 精度是浮点数,要用double存放,用%lf读入
while (1) {
sum += sign/i;
if (1.0/i <= d) break;
sign = -sign;
i += 3;
}
printf("sum = %.6f", sum);
}