ljy5011 发表于 2021-10-28 22:01:44

求助 c语言题

题目:1-1/3+1/5-1/7+1/9.... 求共五十项之和


我的代码
#include <stdio.h>
int main()
{
        int i = 1;
        float y;
        double s = 1.0;
        int k = -1;
        double sum=0;
        for (; i<=50; i++)
        {
                if (i % 2 != 0 &&i!=1)
                {
                        y = (float)i;
                        sum = 1.0/ y;
                        s += k*sum;
                        k = -k;

                }
        }
        printf("%f\n", s);

        system("pause");
        return 0;


}   结果是 0.795394   






网上代码   结果是0.780399          
#include<stdio.h>
int main()
{
long n;
while (scanf_s("%ld", &n) != -1)
{
double s = 0.0;
int i, a = 1;
for (i = 1; i <= 2 * n - 1; i += 2)
{
if (((i + 1) / 2) % 2 == 1)
s += 1.0 / i;
else
s -= 1.0 / i;
}
printf("%.5f", s);
}
return 0;
}


为什么结果差精度?? 求助

jhq999 发表于 2021-10-28 22:13:41

本帖最后由 jhq999 于 2021-10-28 22:15 编辑


for (; i<50; i++)//49项+上s=1一共50项
      {
               
                        y = (float)(2*i+1);
                        sum = 1.0/ y;
                        s += k*sum;
                        k = -k;

               
      }

wutianlong220 发表于 2021-10-28 23:55:14

本帖最后由 wutianlong220 于 2021-10-28 23:56 编辑

我仔细算了,你的题目其实并没有问题,你的精度是对的。你仔细看你网上找过来的那段代码,
如果整理一下其实是这样的:
#include<stdio.h>
int main()
{
        long n;
        while (scanf("%ld", &n) != -1) {
                double s = 0.0;
                int i, a = 1;
                for (i = 1; i <= 50; i += 2) {
               
                        if (((i + 1) / 2) % 2 == 1) {
                                s += 1.0 / i;
                        } else {
                                s -= 1.0 / i;
                        }
                               
                       
                       
                }
                printf("%.5f", s);
        }
        return 0;
}


因为他的精度是需要手动输入需要求的位数,我们把他的代码改一下,把手动输入的那个地方去掉,代码就变成了这样:
#include<stdio.h>
int main()
{
        //long n;
        //while (scanf("%ld", &n) != -1) {
                double s = 0.0;
                int i, a = 1;
                for (i = 1; i <= 50; i += 2) {
               
                        if (((i + 1) / 2) % 2 == 1) {
                                s += 1.0 / i;
                        } else {
                                s -= 1.0 / i;
                        }
                               
                        printf("%d %f %f\n",i, 1.0/i , s);       //这一段是我自己加的,用来打印精度
                       
                }
                printf("%.5f", s);
        //}
        return 0;
}

和你的代码一样,都是前50项的和相加,我这边算出来的结果是:


然后再看看你的代码:
#include <stdio.h>
int main()
{
      int i = 1;
      float y;
      double s = 1.0;
      int k = -1;
      double sum=0;
      for (; i<=50; i++)
      {
                if (i % 2 != 0 &&i!=1)
                {
                        y = (float)i;
                        sum = 1.0/ y;
                        s += k*sum;
                        k = -k;
                                                printf("%d %f %f %f\n",i, y, sum, s);
                }
      }
      printf("%f\n", s);

      //system("pause");
      return 0;


}

也加上一段打印精度,结果如图:


你看,这不是一样的吗?
我猜你之前觉得精度不一样,是不是在输入的时候,填写了50,但是因为网上那个答案,填写进去的数字是n,还需要2*n-1,导致最终的计算精度远远大于你代码当中的50,所以导致了你的精度比它差很多。

阿萨德按时 发表于 2021-10-29 10:40:42

{:10_254:}

1molHF 发表于 2021-10-29 10:53:47

{:10_256:}

傻眼貓咪 发表于 2021-10-29 11:00:39

#include <stdio.h>

int main()
{
    double sum = 0;
    int s = 1;
    for(int i = 1, n = 0; n < 50; i += 2, n++){
      sum += s*(1.0/i);
      s = -s;
    }
    printf("%lf", sum);
    return 0;
}0.780399

心驰神往 发表于 2021-10-29 11:25:14

1molHF 发表于 2021-10-29 10:53


ljy5011 发表于 2021-10-29 22:00:15

wutianlong220 发表于 2021-10-28 23:55
我仔细算了,你的题目其实并没有问题,你的精度是对的。你仔细看你网上找过来的那段代码,
如果整理一下其 ...

谢谢哥
页: [1]
查看完整版本: 求助 c语言题