添加的结果(for循环)不符合预期



我正在尝试构建一个计算器,它可以输入一个数字n,它可以自动输出的总和1/2+2/2 +1/3+2/3+3/3 +…+1/n+2/n+…+n/n,对于每个分母,输出结果一次。输出1/2+2/2 +1/3+2/3+3/3 +…+1/n+2/n+…的最终结果后,重新启动并要求输入。+n/n当用户决定停止程序时输入0

对于input=3,输出是sum= 1,sum=2,但我期望它是sum=3/2, sum=7/2

程序如下

#include <stdio.h>
int main(){

printf("Please enter the max denominator:n");  

int i,j,n;
int sum=0;
do{
scanf("%d",&n);
for (j=2;j<=n;j++){
for(i=1;i<=j;i++){
sum+= i/j;

if (i==j){
printf("sum=%dn",sum);
break;
}
}

}
} while (n!=0);

return 0;
}

编辑:修改部分由于建议

int i,j,n;
double sum=0.0;
do{
scanf("%d",&n);
sum=0.0;
for (j=2;j<=n;j++){
for(i=1;i<=j;i++)
sum+=(double)i/j;
printf("sum=%lfn",sum);
}

} while (n!=0);
return 0;
}

您的程序正在处理整数。ijnsum均为整数。这意味着它们不能对3/2或7/2这样的数字进行编码。

那么当你除两个整数,比如1/2,会发生什么呢?答案是结果四舍五入到最接近的整数。因为1/2是0.5,所以它下面最接近的整数是0,所以结果是0。

您需要使用float,它使用浮点运算。浮点运算有它自己的一套有趣的舍入问题(您可能会惊讶地发现& 0.2&;不能精确地用浮点数表示)。

一个更精确的替代方法是编写自己的函数来处理有理数作为一对整数——分子和分母。它将需要额外的算法(如最大公约数算法),但它可以准确地描述这类问题。

最新更新