求1-5的阶乘和
int n=0;int a=1;
for(int j=1;j<=5;j++)
{ a=1; //重置?为什么要重置,不重置的值是34863.重置了就对了
for(int i=1;i<=j;i++)
{ a=a*i;}
n=n+a;
}
想问一下具体的循环是怎么实现的(就是外层循环,内层循环具体怎么得到,举例比如当J=1,2,3;)还有重置的作用,以及不重置为何会得到34863这样的答案
需要详细点的分多少无所谓
用!表示阶乘,不重置的话,计算出来的是1!+1!2!+1!2!3!+1!2!3!4!+1!2!3!4!5!, 所以是34863。
因为不重置,每次都在前一项的基础上乘了一个i!,但是我们只需要在前一项的基础上乘以i就行了,所以多乘了。
重置的话,虽然是正确的,但是多此一举嘛,搞什么二重循环?觉得cpu太快了么?已经算好4!了,算5!的阶乘,只需要在4!上乘以5就行了,非得重置为1,然后再乘1 2 3 4 5,太浪费了……
正常的写法应该是:
int n=0, a=1;
for (int i=1; i<=5; i++)
{
a*=i;
n+=a;
}
外层开始第一次循环j=1
执行a=1
~~内层开始第一次循环i=1
~~执行a=a*i=1*1=1
执行n=n+a=0+1=1
外层开始第二次循环j=2
执行a=1
~~内层开始第一次循环i=1
~~执行a=a*i=1*1=1
~~内层开始第二次循环i=2
~~执行a=a*i=1*2=2
执行n=n+a=1+2=3
外层开始第三次循环j=3
执行a=1(如果不执行的话a任然等于2)
~~内层开始第一次循环i=1
~~执行a=a*i=1*1=1(如果刚才不执行的话a=2)
~~内层开始第二次循环i=2
~~执行a=a*i=1*2=2(如果刚才不执行的话a=4)
~~内层开始第三次循环i=3
~~执行a=a*i=2*3=6(如果刚才不执行的话a=12)
执行n=n+a=3+6=9(如果刚才不执行的话n=15)
外层开始第四次循环j=4
…………
后面的就省略不写啦
在这段代码中,外层循环的目的是依次枚举从1到5一共5个数字,存入变量j;内层循环的作用是求j的阶乘,结果保存为变量a,然后把a累加到变量n。
求阶乘需要从1开始,沿自然数列依次向上乘,结果累乘到变量a,所以每次内层循环开始时变量a必须被重置成1,否则求下一个数字的阶乘时就不是从1开始计算了。
希望LZ能明白。
这个方法貌似麻烦了
之所以重至 是因为里面每次循环需要重新算一次阶乘
所以要把乘数归1 算出来的结果才对
但是这样写 就有点麻烦了 其实一道循环就够了
下面贴下我的代码
希望我的回答对你有帮助 如果有不懂可以继续问我
如果你满意我的回答 请选为满意答案
#include <iostream.h>
void main()
{
int sum=0,m=1;
for(int i=1;i<=5;i++)
{
m*=i;
sum+=m;
}
cout<<sum<<endl;
}