C语言 添加的结果(for循环)与预期的不一样

e4eetjau  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(109)

我在试着做一个计算器,输入一个数字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。

对于输入=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=%d\n",sum);
                break;
                }
            }
        
        }
    } while (n!=0);
   
    return 0;
}

EDIT:因建议而修订的零件

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=%lf\n",sum);
        }
    
} while (n!=0);

return 0;
}
qxsslcnc

qxsslcnc1#

您的程序正在使用整数。ijnsum都是整数。这意味着它们不能对3/2或7/2之类的数字进行编码。
那么,当你把两个整数相除,比如1/2,会发生什么呢?答案是结果向下舍入到最接近的整数。因为1/2是0.5,低于它的最接近的整数是0,所以结果是0。
您需要使用float,它使用浮点运算,浮点运算有自己的fun rounding issues集合(您可能会惊讶地发现“0.2”不能用浮点数精确表示)。
一个更准确的替代方法是编写自己的函数,将有理数作为一对整数--一个分子和一个分母--来处理。这将需要额外的算法(如最大公约数算法),但它可以准确地描述这类问题。

相关问题