浙大版《C语言程序设计实验与习题指导(第3版)》题目集 实验4-1-6 求分数序列前N项和 (15分)较大n出错

题目:(C编程)

本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+… 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。

输入样例:

20

输出样例:

32.66

错误代码:

最后一个测试点显示:较大n结果错误

#include<stdio.h>
#include<math.h>
int main()
{
	int i=0,n,up=2,low=1,t;
	double s=0;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		printf("%d %d\n",up,low);
		s+=((1.0*up)/low);
		t=up;
		up=low+up;
		low=t;
	}
	printf("%.2f",s);
	return 0;
}

错误结果:

为此我输入50观察,发现1836311903+1134903170成了负数
超出int范围了

50
2 1
3 2
5 3
8 5
13 8
21 13
34 21
55 34
89 55
144 89
233 144
377 233
610 377
987 610
1597 987
2584 1597
4181 2584
6765 4181
10946 6765
17711 10946
28657 17711
46368 28657
75025 46368
121393 75025
196418 121393
317811 196418
514229 317811
832040 514229
1346269 832040
2178309 1346269
3524578 2178309
5702887 3524578
9227465 5702887
14930352 9227465
24157817 14930352
39088169 24157817
63245986 39088169
102334155 63245986
165580141 102334155
267914296 165580141
433494437 267914296
701408733 433494437
1134903170 701408733
1836311903 1134903170
-1323752223 1836311903   //wrong
512559680 -1323752223
-811192543 512559680
-298632863 -811192543
-1109825406 -298632863
-1408458269 -1109825406

pyhton对应结果:

#前面省略
1134903170 1836311903
1836311903 2971215073
2971215073 4807526976
4807526976 7778742049
7778742049 12586269025
12586269025 20365011074
20365011074 32951280099
81.20
>>> 

查阅了这篇博客后,发现
float类型是 6~7位
double类型是15~16位
故用double类型定义分子分母。

改正代码:

类型改了就行了

#include<stdio.h>
#include<math.h>
int main()
{
	int i=0,n;
	double up=2,low=1,t;
	double s=0;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		s+=((1.0*up)/low);
		t=up;
		up=low+up;
		low=t;
	}
	printf("%.2f",s);
	return 0;
}

反思:

太久没写c语言了,很多类型输入输出都没注意到。
而熟悉python写法后,更加忘记了数据类型float,int之类。

发布了22 篇原创文章 · 获赞 4 · 访问量 867

猜你喜欢

转载自blog.csdn.net/qq_43745026/article/details/104813377