本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。
第一次错误:
#include<stdio.h> void main() { int son = 2, mom = 1, temp, i = 0, n; double sum = 0; scanf_s("%d", &n); while (i < n) { sum = sum + son * 1.0 / mom; temp = son; son = son + mom; mom = temp; i++; } printf("%.2f", sum); }
我看了许久的代码,实在是没发现哪里有逻辑错误,后来一步一步用断点试错,发现在43次循环时son=son+mom出了问题,son被赋了一个很大的负值。
原来,int的位数有限,在多次循环后son+mom已经超出了int能表达的最大值,造成数据溢出。
于是我想用long,就把int改为了long
long son = 2, mom = 1, temp, i = 0, n;
结果,还是错的,后来我一查,发现在32位机器中int与long竟然都是4字节,long与int没有区别,long并不比int更“long”。
于是我把long又改成double,double是8个字节,可以表达的数位要更多。
因为我怕无关数搞成double可能会出错,就把n,i继续留在int型。
double son=2,mom=1,temp; int n, i=0;
结果通过。