练习4-3 求给定精度的简单交错序列部分和

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/melody_1016/article/details/82817727

练习4-3 求给定精度的简单交错序列部分和 (15 分)

本题要求编写程序,计算序列部分和 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

 分析:本题与之前做过的交错序列和相加题型类似。但是这道题要特别注意也最易错的一点就是:“直到最后一项的绝对值不大于给定精度eps”这句话。也就是说最后一项的数值是<=eps的,而且这个数值也要算在加和sum中;所以如果用while循环,一定要注意在while循环内部,double num = sign*1.0 / i;这一句要写在sum = sum + num之前,否则循环会少进行一次,也就导致序列和的最后一个数值(即<=eps的那个值)没有被加进sum中。

如下:(循环少进行了一次,序列和的最后一个数值(即<=eps的那个值)没有被加进sum中)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
double sum = 0;
	double eps = 0;//精度
	int i = 1;//分母
	int sign = 1;//标志位(正、负)
	double num = sign*1.0 / i;//每一项数值
	scanf("%lf", &eps);
	while (fabs(num) >eps)
	{
		sum = sum + num;
		printf("num=%.6f,sum=%.6f\n", num, sum);
		i += 3;
		sign = -sign;
		num = sign*1.0 / i;

	}
	printf("sum = %.6f\n", sum);
        system("pause");
	return 0;
}

测试结果(以esp=0.02为例),左边为正确答案,右边少循环一次

修改后代码:(while循环)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
//while循环
	double sum = 0;
	double eps = 0;//精度
	int i = 1;//分母
	int sign = 1;//标志位(正、负)
	double num = sign*1.0 / i;//每一项数值
	sum = sum + num;
	scanf("%lf", &eps);
	//printf("num=%.6f,sum=%.6f\n", num, sum);//便于调试用
	while (fabs(num) >eps)
	{
		//sum = sum + num;
		i += 3;//因为没有进入循环前已经计算了第一项,所以进入循环后要从第二项开始
		sign = -sign;
		num = sign*1.0 / i;//每一项数值,这句一定要放在sum = sum + num;前面
		sum = sum + num;
		//printf("num=%.6f,sum=%.6f\n", num, sum);//这句只是便于调试用的
		//i += 3;
		//sign = -sign;

	}
	printf("sum = %.6f\n", sum);
        system("pause");
	return 0;
}

测试结果:

do while循环:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
//我的do while循环
	double sum = 0;
	double eps = 0;//精度
	int i = 1;//分母
	int sign = 1;//标志位(正、负)
	double num =0;
	scanf("%lf", &eps);
	do
	{
		num = sign*1.0 / i;//这句一定要在sum = sum + num;前面
		sum = sum + num;
		//printf("num=%.6f,sum=%.6f\n", num, sum);
		i += 3;
		sign = -sign;
	} while (fabs(num) > eps);

	printf("sum = %.6f\n", sum);
        system("pause");
	return 0;
}

测试结果:

 

 

展开阅读全文

没有更多推荐了,返回首页