求1-m的阶乘和

这篇博客探讨了求1到m的阶乘和过程中出现的计算错误。作者详细解释了错误产生的原因,即在迭代过程中未能正确重置变量ask的值,导致阶乘计算错误。为了解决问题,建议在每次执行第二个for循环前将ask的值重置为1,以确保正确计算m的阶乘。博客内容涉及迭代原理和程序修复技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<strong><span style="font-size:24px;">问题代码:</span></strong>
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i,m,sum=0,ask=1,n;
    scanf("%d",&m);
    for(i=1;i<=m;i++)
    {
        for(n=1;n<=i;n++)
            ask=ask*n;
            sum=sum+ask;
    }
    printf("%d",sum);
    return 0;
}
<strong><span style="font-size:24px;">运行结果:当m=3</span></strong>

原因:

                                          n

当i=1时,i<=m是成立的,1<=i也是成立的,所以ask=1*1=1,sum=0+1=1。

当i=2时,i<=m是成立的,1<=i也是成立的,所以ask=1*1=1;

                                          2<=i也是成立的,所以ask=1*2=2,sum=1+2=3。

当i=3时,i<=m是成立的,1<=i也是成立的,所以ask=2*1=2;

                                          2<=i也是成立的,所以ask=2*2=4;

                                          3<=i也是成立的,所以ask=4*3=12,sum=3+12=15。

:刚才在分析的时候出现了一个错误,错误如下:

当i=1时,i<=m是成立的,1<=i也是成立的,所以ask=1*1=1,sum=0+1=1。

当i=2时,i<=m是成立的,1<=i也是成立的,所以ask=1*1=1,sun=1+1=2;

                                          2<=i也是成立的,所以ask=1*2=2,sum=2+2=4。

当i=3时,i<=m是成立的,1<=i也是成立的,所以ask=2*1=2 ,  sum=4+2=6;

                                          2<=i也是成立的,所以ask=2*2=4;sum=6+4=10;

                                          3<=i也是成立的,所以ask=4*3=12,sum=10+12=22。

造成分析错误的原因是 我把ask=ask*n;sum=sum+ask这个整体看成了for的语句2,要想解决这个问题,我们用花括号把ask=ask*n括起来。

分析完了分析的错误我们来看代码的错误。

很明显ask的值是在发生着变化的,类似于老师交给我们的迭代。第二个for循环的目的是为了求m!,但是在进行完第二个for循环后我们发现:ask的值改变了。所以,再次进入第二个for循环时ask的值不在为1,也就无法达到我们求m!的目的。因此,在每次进行完第二个for语句时,我们要对ask的值进行“归零”,让它变成1,能够计算m!。

更改后的程序:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i,m,sum=0,ask=1,n;
    scanf("%d",&m);
    for(i=1,ask=1;i<=m;i++)
    {
        for(n=1;n<=i;n++)

            ask=ask*n;
            sum=sum+ask;
    }
    printf("%d",sum);
    return 0;
}


































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值