Choco_nut
Choco_nut
采纳率80%
2016-11-03 14:47

一道c程序练习题求修改代码。

已采纳

int main()
{int n,m,kase = 0;
float r;
while(scanf("%d %d",&n,&m) == 2 && (n||m))
{for(int i = n;i <= m;i++)
r += (float)(1/(i*i));
printf("Case %d : %.5f",++kase,r);
}
return 0;
}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

3条回答

  • tutuxs Xefvan 5年前

    很明显的错误, 第一 "r" 没有赋初值

    第二类型转换的问题!!!!

    在你的for循环里

     r += (float)(1/(i*i));
    

    这句话是错误的来源,首先

     1/(i*i)
    

    因为都是整形,所以运算的时候如果i的平方大于1,其结果都为0,计算完结果后才把整形转换为float型!!

    因此代码应该改为

     r += (float)1/(i*i);
    
    或者
    
    r += 1 / (float)(i*i);
    
    或者
    
    r += 1 / pow(i, 2);   // 这种的话要加上头文件"math.h",而且也不用担心类型转换了
    

    针对第一种,它会将整形1转换为浮点型float,为了能够进行计算,i的平方也自动转换为浮点型,所以计算的结果就是浮点型,

    r得以正确赋值,最后就是你的计算完成后记得再次将r赋值为0,否则下次计算的值是叠加值

    附上代码:

    #include <stdio.h>
    #include <math.h>
    int main()
    {
        int n,m,kase = 0;
        float r = 0;
        while(scanf("%d %d",&n,&m) == 2 && (n||m))
        {
            for(int i = n;i <= m;i++)
            {
                r += 1 / (float)(i*i);
                // r += 1 / pow(i, 2);
            }
            printf("Case %d : %.5f\n",++kase,r);
            r = 0;
        }
        return 0;
    }
    
    
    点赞 1 评论 复制链接分享
  • Choco_nut Choco_nut 5年前

    题名:子序列的和(subsequence)
    输入两个正整数n<m<10^6,输出1/n^2+1/(n+1)^2+……+1/m^2,保留五位小数。输入包含多组数据,结束标记为n=m=0。
    样例输入:
    2 4
    65536 655360
    0 0
    样例输出:
    Case 1: 0.42361
    Case 2: 0.00001

    点赞 评论 复制链接分享
  • caozhy 回答这么多问题就耍赖把我的积分一笔勾销了 5年前