鱼C论坛

 找回密码
 立即注册
查看: 1616|回复: 7

[已解决]求助 c语言题

[复制链接]
发表于 2021-10-28 22:01:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目: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;
}


为什么结果差精度?? 求助
最佳答案
2021-10-28 23:55:14
本帖最后由 wutianlong220 于 2021-10-28 23:56 编辑

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


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

和你的代码一样,都是前50项的和相加,我这边算出来的结果是:
QQ20211028-235114@2x.png

然后再看看你的代码:
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int i = 1;
  5.         float y;
  6.         double s = 1.0;
  7.         int k = -1;
  8.         double sum=0;
  9.         for (; i<=50; i++)
  10.         {
  11.                 if (i % 2 != 0 &&i!=1)
  12.                 {
  13.                         y = (float)i;
  14.                         sum = 1.0/ y;
  15.                         s += k*sum;
  16.                         k = -k;
  17.                                                 printf("%d %f %f %f\n",i, y, sum, s);
  18.                 }
  19.         }
  20.         printf("%f\n", s);

  21.         //system("pause");
  22.         return 0;


  23. }  
复制代码


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

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

使用道具 举报

发表于 2021-10-28 22:13:41 | 显示全部楼层

回帖奖励 +5 鱼币

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

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

  8.                
  9.         }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-28 23:55:14 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +5 鱼币

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

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


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

和你的代码一样,都是前50项的和相加,我这边算出来的结果是:
QQ20211028-235114@2x.png

然后再看看你的代码:
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int i = 1;
  5.         float y;
  6.         double s = 1.0;
  7.         int k = -1;
  8.         double sum=0;
  9.         for (; i<=50; i++)
  10.         {
  11.                 if (i % 2 != 0 &&i!=1)
  12.                 {
  13.                         y = (float)i;
  14.                         sum = 1.0/ y;
  15.                         s += k*sum;
  16.                         k = -k;
  17.                                                 printf("%d %f %f %f\n",i, y, sum, s);
  18.                 }
  19.         }
  20.         printf("%f\n", s);

  21.         //system("pause");
  22.         return 0;


  23. }  
复制代码


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

你看,这不是一样的吗?
我猜你之前觉得精度不一样,是不是在输入的时候,填写了50,但是因为网上那个答案,填写进去的数字是n,还需要2*n-1,导致最终的计算精度远远大于你代码当中的50,所以导致了你的精度比它差很多。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-29 10:40:42 | 显示全部楼层

回帖奖励 +5 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-29 10:53:47 | 显示全部楼层

回帖奖励 +5 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-29 11:00:39 | 显示全部楼层

回帖奖励 +5 鱼币

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     double sum = 0;
  5.     int s = 1;
  6.     for(int i = 1, n = 0; n < 50; i += 2, n++){
  7.         sum += s*(1.0/i);
  8.         s = -s;
  9.     }
  10.     printf("%lf", sum);
  11.     return 0;
  12. }
复制代码
  1. 0.780399
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-29 11:25:14 | 显示全部楼层

回帖奖励 +5 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢哥
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 17:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表