鱼C论坛

 找回密码
 立即注册
查看: 1366|回复: 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 编辑

我仔细算了,你的题目其实并没有问题,你的精度是对的。你仔细看你网上找过来的那段代码,
如果整理一下其实是这样的:
#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项的和相加,我这边算出来的结果是:
QQ20211028-235114@2x.png

然后再看看你的代码:
#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;


}  

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

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

使用道具 举报

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

回帖奖励 +5 鱼币

本帖最后由 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;

                
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +5 鱼币

本帖最后由 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项的和相加,我这边算出来的结果是:
QQ20211028-235114@2x.png

然后再看看你的代码:
#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;


}  

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

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

使用道具 举报

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

回帖奖励 +5 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +5 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +5 鱼币

#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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +5 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢哥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 19:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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