| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1957 人关注过本帖
标题:问个循环问题 老溢出是怎么回事?
只看楼主 加入收藏
kissyoume
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2008-8-1
结帖率:0
收藏
 问题点数:0 回复次数:13 
问个循环问题 老溢出是怎么回事?
求E=1+1/1!+1/2!+1/3!+1/N!  用for 循环 输出前50项
main()
{ double s,a,n,b,c,i;
  clrscr();
 s=1.0,a=1.0,b=1.0;
 for(n=1.0;n<=49;N++)
{
 for(i=1.0;i<=n;i++)
 {b=b*i;}
 c=a/b;s=s+c;
}
printf("s=%f\n",s);
}
我用的是TC 怎么算结果overflow大家帮帮忙
搜索更多相关主题的帖子: double 
2008-08-28 19:02
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:0 
for(n=1.0;n<=49;N++)?

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-08-28 19:12
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:0 
我用VC编译完全没问题。或许是TC不支持太大的数据的缘故吧
(PS:你的代码书写风格很烂)
#include <stdio.h>

void main()
{
    double s, a, n, b, c, i;
    s = 1.0, a = 1.0, b = 1.0;
    for(n = 1.0; n <= 49; n++)
    {
        for(i = 1.0; i <= n; i++)
        {
            b = b * i;
        }
        c = a / b;
        s = s + c;
    }
    printf("s=%f\n", s);
}


[color=white]

[[it] 本帖最后由 flyue 于 2008-8-28 19:16 编辑 [/it]]

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-08-28 19:13
smltq
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:566
专家分:400
注 册:2008-1-21
收藏
得分:0 
tc的double放得上50!吗`````
2008-08-28 19:47
似水如风
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2008-8-24
收藏
得分:0 
你的程序错误太多,建议好好改改。
2008-08-28 20:45
忆馨亦伊
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2008-8-26
收藏
得分:0 
有这样一个求n!的方法可是我对pnext()函数不懂啊,请高手指点下
/*     
   
          本程序对给定的n(n<=100),计算出输出k!(k=1,2,...,n)的全部有效数字,因k!的值可能很大,故采用一维数组存储计算结果。设数组的每个元素存储k!的一位数字,并约定从低位到高位依次存于数组的第一个位置,第二个位置···。   
  程序中,计算k!采用对已求得的(k-1)!的结果连续加k-1次后求出,例如,4!=24,则计算5!对原来的24累加4次后得到120。为了控制累加的位数,另引入整型变量c用于记录当前(k-1)!的位数。   
   
  */   
  #include   <stdio.h>   
   
  #define   MAXN   1000   
   
  int   a[MAXN],   b[MAXN];   
   
  void   pnext(int   k,   int   *cp)   
  {   
  int   c   =   *cp,   i,   m,   r;   
  for   (i   =   0;   i   <   c;   i++)   
  b[i]   =   a[i];   
  a[c]   =   0;   
  for   (m   =   1;   m   <   k;   m++)   
  for   (i   =   0;   i   <   c;   i++)   {   
  r   =   a[i]   +   b[i];   
  a[i]   =   r   %   10;   
  a[i   +   1]   +=   r   /   10;   
  }   
  r   =   a[c];   
  while   (r   >   0)   {   
  a[c++]   =   r   %   10;   
  r   =   r   /   10;   
  }   
  *cp   =   c;   
  }   
   
  void   write(int   *a,   int   k,   int   c)   
  {   
  int   i;   
  printf("%4d!   =   ",   k);   
  for   (i   =   c   -   1;   i   >=   0;   i--)   
  printf("%d",   a[i]);   
  printf("\n\n");   
  }   
   
  main()   
  {   
  int   n,   c,   k;   
  printf("Enter   the   number   n(<=100):");   
  scanf("%d",   &n);   
  a[0]   =   1;   
  c   =   1;   
  write(a,   1,   c);   
  for   (k   =   2;   k   <=   n;   k++)   {   
  pnext(k,   &c);   
  write(a,   k,   c);   
  getchar();   
  }   
  }
2008-08-28 21:46
zhf63
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-8-26
收藏
得分:0 
main()
{ double s,a,n,b,c,i;
  clrscr();
s=1.0,a=1.0,b=1.0;
for(n=1.0;n<=49;N++)
{//这里应该使b重新赋值为1.0
  b=1.0;
  for(i=1.0;i<=n;i++)
  {b=b*i;}
  c=a/b;s=s+c;
}
printf("s=%f\n",s);
}
另外写程序时要注意一下格式。
2008-08-29 11:26
hoodlum1980
Rank: 2
来 自:浙江大学
等 级:论坛游民
威 望:2
帖 子:289
专家分:23
注 册:2008-2-24
收藏
得分:0 
for(i=1.0;i<=n;i++)
{b=b*i;}

你这里面肯定要溢出的,要知道n!的渐近阶是非常高的。这种题目一般都是考大数算法,而不是直接用内置数据类型算。
2008-08-29 11:37
p1s
Rank: 4
等 级:贵宾
威 望:10
帖 子:454
专家分:3
注 册:2005-11-4
收藏
得分:0 
1、对于项数不是很多的,可以用除法来做,避免用乘法发生溢出。
2、对于项数很多的,要么用大数的方法做,要么用高精度的方法做。大数做乘法,高精度做除法。

对于1的程序代码:
#include <stdio.h>
int main()
{
    int i,j;
    double s=1.0,a=1.0;
    printf("Please input i:\n");
    scanf("%d",&i);
    for (j=1;j<=i;j++)
    {
        s=s+a/j;
        a=a/j;
    }
    printf("sum=%.20f\n",s);
    return 0;
}
2008-08-29 15:27
似水如风
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2008-8-24
收藏
得分:0 
回复 8# hoodlum1980 的帖子
50!对于double来说不会溢出。
2008-08-30 21:41
快速回复:问个循环问题 老溢出是怎么回事?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.061646 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved