[2020.3.13]改错3

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

结果通过。

猜你喜欢

转载自www.cnblogs.com/fake8864/p/12497389.html