<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;
}