小代码里的错误

作者在 2011-09-07 22:04:00 发布以下内容
编写程序,求下面级数前n项中偶数项的和ES。在求和过程中,以第一个绝对值大于9999的项为末项,计算并输出和数ES。(其中^表示幂运算)
题目出自:http://bbs.bccn.net/viewthread.php?tid=349405&pid=2005275&page=1#pid2005275
1!-2!+3!-4!+……+(-1)^(n-1)*n!+ ……
#include<stdio.h>
void main()
{
    int OS=0,ES=0,SUM=0,n=1,temp=1;//奇数项和:OS,偶数项和:ES,奇偶数项和:SUM
    while(temp<-9999||temp>9999)
    {        
        if(n%2!=0)
        {
            OS+=temp;
        }
        else
        {
            ES-=temp;
        }
        n++;
        temp*=n;
    }
    SUM=OS+ES;
    printf("n=%d,temp=%d\n",n,temp);
    printf("奇数项和等于\t%d\n",OS);
    printf("偶数项和等于\t%d\n",ES);
    printf("奇偶数项和等于\t%d\n",SUM);
}
上述代码没有编译及运行错误。但是结果是:
n=1,temp=1
奇数项和等于      0
偶数项和等于      0
奇偶数项和等于   0
显然不是我们所要求的结果。
修改了一下:
#include<stdio.h>
void main()
{
    int OS=0,ES=0,SUM=0,n=1,temp=1;//奇数项和:OS,偶数项和:ES,奇偶数项和:SUM
    while(temp>=-9999||temp<=9999)
    {        
        if(n%2!=0)
        {
            OS+=temp;
        }
        else
        {
            ES-=temp;
        }
        n++;
        temp*=n;
    }
    SUM=OS+ES;
    printf("n=%d,temp=%d\n",n,temp);
    printf("奇数项和等于\t%d\n",OS);
    printf("偶数项和等于\t%d\n",ES);
    printf("奇偶数项和等于\t%d\n",SUM);
}
但是上述代码没有结果输出,准确的说是在进行死循环。
问题出在while(temp>=-9999||temp<=9999)且while语句中没有中断while语句的语句。
再次修改:
#include<stdio.h>
void main()
{
    int OS=0,ES=0,SUM=0,n=1,temp=1;//奇数项和:OS,偶数项和:ES,奇偶数项和:SUM
    while(temp>=-9999&&temp<=9999)
    {        
        if(n%2!=0)
        {
            OS+=temp;
        }
        else
        {
            ES-=temp;
        }
        n++;
        temp*=n;
    }
    SUM=OS+ES;
    printf("n=%d,temp=%d\n",n,temp);
    printf("奇数项和等于\t%d\n",OS);
    printf("偶数项和等于\t%d\n",ES);
    printf("奇偶数项和等于\t%d\n",SUM);
}
输出:
n=8,temp=40320
奇数项和等于       5167
偶数项和等于       -746
奇偶数项和等于    4421
 
经好友提醒,我发现原来的代码错了。
修改如下:
#include<stdio.h>
void main()
{
    int OS=0,ES=0,SUM=0,n=1,temp=1;//奇数项和:OS,偶数项和:ES,奇偶数项和:SUM
    while(temp<=9999)
    {        
        if(n%2!=0)
        {
            OS+=temp;
        }
        else
        {
            ES-=temp;
        }
        n++;
        temp*=n;
    }
    
    ////////////////////////////////////
    
////////增加对末项进行操作//////////
    
////////////////////////////////////
    if(n%2!=0)
    {
        OS+=temp;
    }
    else
    {
        ES-=temp;
    }
    ////////////////////////////////////
    
////////////////////////////////////
    SUM=OS+ES;
    printf("n=%d,temp=%d\n",n,temp);
    printf("奇数项和等于\t%d\n",OS);
    printf("偶数项和等于\t%d\n",ES);
    printf("奇偶数项和等于\t%d\n",SUM);
}

输出:
n=8,temp=40320
奇数项和等于 5167
偶数项和等于 -41066
奇偶数项和等于 -35899
 
特别谢谢edwardflee 指出我的错误。
 
C语言问题 | 阅读 1365 次
文章评论,共4条
edwardflee
2011-09-08 12:33
1
帅哥,你这里temp试数,就是1,1*2,1*2*3...,不会出现负值啊,while那里不用去&amp;&amp; temp&gt;=-9999了吧<img src="image/face/22.gif" class="face">
edwardflee
2011-09-08 13:23
2
好像还有个问题,第一个绝对值大于9999的数似乎没有被计算在内,是不是应该把temp*=n;移到if...else前面去?
laznrbfe(作者)
2011-09-08 19:47
3
<div class="quote"><span class="q"><b>edwardflee</b>: 帅哥,你这里temp试数,就是1,1*2,1*2*3...,不会出现负值啊,while那里不用去&amp;&amp; temp&gt;=-9999了吧<img src="image/face/22.gif" class="face"></span></div><img src="image/face/2.gif" class="face">这个是我的思维不严谨谢谢。我改一下。
laznrbfe(作者)
2011-09-08 19:48
4
<div class="quote"><span class="q"><b>edwardflee</b>: 好像还有个问题,第一个绝对值大于9999的数似乎没有被计算在内,是不是应该把temp*=n;移到if...else前面去?</span></div>恩,是我的错。谢谢指出。
游客请输入验证码
浏览48167次