鱼C论坛

 找回密码
 立即注册
查看: 2757|回复: 12

帮忙看看 到底哪里错了

[复制链接]
发表于 2011-11-15 23:10:00 | 显示全部楼层 |阅读模式

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

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

x
这是计算机二级的一道题,可是怎么代码是错的,帮忙看看
输入n,求s=1+1/(1+2)+1/(1+2+3)+...+1/(1+2+3+..+n)
我学C不久 见笑     我的代码在下面 答案怎么总是错的



#include<stdio.h>

double fun(int n);

void main()
{
        int n;
        double sum;
        printf("please inpur N :");
        scanf("%d",&n);
        sum=fun(n);
        printf("sum = %lf\n",sum);
}

double fun(int n)
{
        double sum=0.00,s=0.00;
        int i,j;
       

    for(s=0.00,i=1;i<=n;i++)
        {
                for(j=1;j<=i;j++)
                {
                        s+=j;
                }
                s=1/s;
                sum+=s;
        }
        return sum;
       
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-11-15 23:14:13 | 显示全部楼层
等回帖 等好人 。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-11-15 23:21:11 | 显示全部楼层
奇了怪了   输入3   怎么得到的是1.41   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-15 23:27:54 | 显示全部楼层
逻辑上没什么错误啊!!
应该是double类型的误差!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-15 23:32:51 | 显示全部楼层
  1. #include<stdio.h>

  2. double fun(int n);

  3. void main()
  4. {
  5.         int n;
  6.         double sum;
  7.         printf("please inpur N :");
  8.         scanf("%d",&n);
  9.         sum=fun(n);
  10.         printf("sum = %lf\n",sum);
  11. }

  12. double fun(int n)
  13. {
  14.         double sum=0.00,s=0.00;
  15.         int i,j;
  16.         

  17.     for(s=0.00,i=1;i<=n;i++)
  18.         {
  19.                 for(j=1;j<=i;j++)
  20.                 {
  21.                         s+=j;
  22.                 }
  23.                 s=1/s;
  24.                 sum+=s;
  25.         }
  26.         return sum;
  27.         
  28. }
复制代码
double类型有一定的误差的!!
for里面向你那样写可以吗?其实我不知道行不行,但是我把那个移到下面程序就OK了!!
我也是初学者,一起进步啊!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-11-15 23:40:26 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-16 00:07:40 | 显示全部楼层
不好意思!!代码发错了啊
  1. #include<stdio.h>

  2. double fun(int n);

  3. void main()
  4. {
  5.     int n;
  6.     double sum;
  7.     printf("please inpur N :");
  8.     scanf("%d",&n);
  9.     sum=fun(n);
  10.     printf("sum = %lf\n",sum);
  11. }

  12. double fun(int n)
  13. {
  14.     double sum=0.00, s;
  15.     int i,j;
  16.    
  17.    
  18.     for(i=1;i<=n;i++)
  19.     {
  20.         s = 0.00;           //for循环里面的问题吧!!我试了可以,刚刚代码发错了!!
  21.         for(j=1;j<=i;j++)
  22.         {
  23.             s+=j;
  24.         }
  25.         s=1/s;
  26.         sum+=s;
  27.     }
  28.     return sum;
  29.    
  30. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-16 08:00:09 | 显示全部楼层
楼上的代码OK,也贴个代码,可以少用一次循环
  1. #include<stdio.h>

  2. double fun(int n);

  3. void main()
  4. {
  5.         int n;
  6.         double sum;
  7.         printf("please inpur N :");
  8.         scanf("%d",&n);
  9.         sum=fun(n);
  10.         printf("sum = %lf\n",sum);
  11. }

  12. double fun(int n)
  13. {
  14.         double sum=0.00,s=0.00;
  15.         int i,j;
  16.        
  17.        
  18.     for(s=0.00,i=1;i<=n;i++)
  19.         {
  20.                 s+=i;
  21.                 sum+=1/s;
  22.         }
  23.         return sum;
  24.        
  25. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-16 08:02:44 | 显示全部楼层
不过在n很大的时候这个算法还是有问题的,应该从右加到左,就是做:
1/(1+2+3+..+n) + 1/(1+2+3+..+n-1) +。。。+1/(1+2) +1/1
结果才更精确
具体原因可以baidu  “大数吃小数”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-11-16 10:02:49 | 显示全部楼层
问题找出来了 是逻辑的错误 手机就不发代码了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-16 12:28:38 | 显示全部楼层
仰望天上的光 发表于 2011-11-16 08:00
楼上的代码OK,也贴个代码,可以少用一次循环

嗯支持这个!!!学习!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-16 13:30:59 | 显示全部楼层
仰望天上的光 发表于 2011-11-16 08:02
不过在n很大的时候这个算法还是有问题的,应该从右加到左,就是做:
1/(1+2+3+..+n) + 1/(1+2+3+..+n-1) + ...
  1. #include<stdio.h>

  2. double fun(int n);

  3. void main()
  4. {
  5.     int n;
  6.     double sum;
  7.     printf("please inpur N :");
  8.     scanf("%d",&n);
  9.     sum=fun(n);
  10.     printf("sum = %lf\n",sum);
  11. }

  12. double fun(int n)
  13. {
  14.     double sum = 0.00, s;
  15.     int i,j;
  16.    
  17.    
  18.     for(i = n; i >= 1; i--)
  19.     {
  20.         s = 0;
  21.         for(j = 1; j <= i; j++)
  22.         {
  23.              s+=j;
  24.         }
  25.         sum+=1/s;
  26.     }

  27.     return sum;
  28. }
复制代码
想问一下,这个可以用一个循环实现吗??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-16 16:10:25 | 显示全部楼层
mт、__宠爱 发表于 2011-11-16 13:30
想问一下,这个可以用一个循环实现吗??

我前面帖的代码就是只用一个循环做的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-4-17 02:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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