C语言循环计算:为什么输入5结果是1?详解整数除法陷阱

你是否遇到过这段C语言代码,当输入为5时,结果却是1的情况?

#include <stdio.h>
int main()
{
	int n, i;
	float num;
	num = 0;

	scanf_s('%d', &n);

	for (i = 1; i <= n; i++)
	{
		num = num + 1 / i;
	}
	
	printf('%f', num);
}

问题根源:整数除法

出现这种情况的原因在于代码中的 num = num + 1 / i 使用了整数除法。在C语言中,当两个整数进行除法运算时,结果会被截断为整数,只保留整数部分,舍弃小数部分。

在本例中,循环变量 i 是整数,1 也是整数,所以 1 / i 会进行整数除法运算。当 i 从1递增到5时,1/i 的结果始终为整数:

  • 1 / 1 = 1
  • 1 / 2 = 0
  • 1 / 3 = 0
  • 1 / 4 = 0
  • 1 / 5 = 0

因此,循环累加的结果最终为1。

解决方案:使用浮点数除法

要解决这个问题,我们需要使用浮点数除法。只需将表达式中的 1 改为 1.0,即可强制进行浮点数除法:

num = num + 1.0 / i;

这样,1.0 / i 的结果将会保留小数部分,循环累加的结果也会是预期的浮点数。

修改后的代码:

#include <stdio.h>
int main()
{
    int n, i;
    float num;
    num = 0;

    scanf_s('%d', &n);

    for (i = 1; i <= n; i++)
    {
        num = num + 1.0 / i;
    }

    printf('%f', num);
}

现在,当输入为5时,输出结果将会是 1.717857,符合预期。

总结

在C语言中进行除法运算时,务必注意操作数的类型,区分整数除法和浮点数除法。如果需要保留小数部分,请确保使用浮点数进行运算。 希望这篇文章能够帮助你理解并避免C语言中常见的整数除法陷阱!

C语言循环计算:为什么输入5结果是1?详解整数除法陷阱

原文地址: https://www.cveoy.top/t/topic/N2S 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录