PTA 编程题(C语言)-- 求给定精度的简单交错序列部分和

题目标题:求给定精度的简单交错序列部分和    题目作者: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);
}
更多PTA题目的的参考代码,可以在wx小程序里搜“PTA刷题助手”。

猜你喜欢

转载自blog.csdn.net/morn_l/article/details/134022849