将分子分母变量定义为int时为什么不正确?

img


#include <stdio.h> 
int main()
{ //如下,为什么当我把左边的两行代码写成右边这样,程序就会报错呢? 
    int N,i;          // int N,i,zi,mu;
    double s,a,zi,mu; // double s,a; 
    scanf("%d",&N);
    zi=2;
    mu=1 ;
    i=1;
    s=0;
    while(i<=N){
        s+=1.0*zi/mu;
        a=zi+mu;
        mu=zi;
        zi=a;
        i++;    
    }
    printf("%.2f",s);
    return 0;
} 

以上除“//”外为正确代码
错误代码报错时的测试点如下图

img

较大n的话int可能溢出了

分子分母都是int,就是整除,没有小数部分的

int zi,mu; 这两个变量为 int 型时,当测试点为较大 N 不能通过,zi mu 可能溢出。

【以下回答由 GPT 生成】

当将分子分母的变量类型定义为int时,程序报错的原因是由于整数除法的特性。在C语言中,整数除法结果会取整数部分,舍弃小数部分,导致计算结果不准确。

在给变量zimu赋值时,zimu的值都是整数类型。当我们计算zi/mu时,由于分子和分母都是整数,计算结果也会被转换为整数类型。这就导致了精度丢失,计算结果只会保留整数部分。

例如,如果zi被赋值为2,mu被赋值为1时,zi/mu的计算结果应该是2/1=2。但由于整数除法的特性,它的计算结果是1,小数部分被舍弃。

这种问题可以通过将分子分母的变量类型改为浮点数类型解决,例如使用double类型。浮点数类型可以精确地表示带有小数部分的数值,从而确保计算结果的准确性。

以下是修改后的代码示例:

#include <stdio.h>
int main()
{
    int N,i;
    double s,a,zi,mu;
    scanf("%d",&N);
    zi=2;
    mu=1;
    i=1;
    s=0;
    while(i<=N){
        s+=zi/mu;
        a=zi+mu;
        mu=zi;
        zi=a;
        i++;    
    }
    printf("%.2f",s);
    return 0;
}

在这个修改后的代码中,分子和分母的变量类型被定义为了double,以确保计算结果的准确性。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^