目录
一.输入n,输出n的阶乘
二.输入n,输出1!+2!+3!+~~~~+n!
法一(两个for循环):
法二(用一个for循环):
一.输入n,输出n的阶乘
n的阶乘就是1乘以2乘以3········一直乘到n,这样就很明显,我们可以用循环来做,那我们就以for循环举个例子:
#include<stdio.h>
int main()
{
int n=0;//
scanf("%d",&n);//输入n,决定求哪个数的阶乘,以及为循环做准备
int a=1;//定义一个变量,用来存储最后结果
for (int i=1;i<=n;i++)//确定循环n次,形成1*2*···*n
{
a=a*i;
}
printf("%d的阶乘是:%d\n",n,a);
return 0;
}
我们运行来看看:
4!=4*3*2*1=24,所以结果正确,这里需要注意一下int类型的范围,一旦输入的n过大,就有可能会出错:
如果需要求比较大的数的阶乘,可用long long类型,输出格式用‘lld’就行
二.输入n,输出1!+2!+3!+~~~~+n!
法一(两个for循环):
这一题跟上一题相比,他把各个阶乘都加起来了,那么我们可以用两个for循环来解决这个问题:
#include<stdio.h>
int main()
{
int n=0;
scanf("%d",&n);//输入n,确定会有n个数的阶乘相加
int he=0;//定义一个变量存放最后相加的结果
for (int i=1;i<=n;i++)//循环n次
{
int a=1;//a定义这里特别重要
for (int j=1;j<=i;j++)//这一个循环跟求n的阶乘是一样的
{
a=a*j;
}//这一个循环结束就求出了一个数(i)的阶乘
he=he+a;//把上面循环求出来的阶乘存起来,并不断累加
}
printf("%d个数各个数的阶乘和是:%d\n",n,he);
return 0;
}
两个for循环,第二个循环它的本质就是求一个数的阶乘,第一个循环就是把各个数的阶乘累加起来,我们运行来看看:
1!+2!+3!+4!=1+2+6+24=33,所以结果正确,这里再提一点,第10行代码我注释它的位置很重要,我们把a定义在第6行试试:
我们运行看看:
1!+2!+3!=9,但结果却变成了15,我们来分析看看:直接看第二个循环,i=1时,我们会有a=1*1=1;继续,i=2;也就是第二个循环要2次,第一次:a=1*1=1,第二次:a=1*2=2;一直到这里看似都没问题,接下来就出现问题了,当i=3;也就是第二个循环要循环三次,第一次:a=2*1=2,第二次:a=2*2=4;第三次:a=4*3=12;所以最后输出结果就是1+2+12=15;第三次循环出现了问题,问题出在a不再是从1开始求阶乘,因为a一直没有清空,它一直保留着上一次循环a存的值,所以a必须放到第10行也就是第二个for循环的前面,这样每循环一次就会把a重新赋值为1,那么第二个循环求阶乘就不会出错
法二(用一个for循环):
这个题用两个for循环感觉有点复杂且需要注意的地方有点多,容易出错,那我们试着能不能用一个循环就解决它:
#include<stdio.h>
int main()
{
int n=0;
scanf("%d",&n);//输入n,确定会有n个数的阶乘相加
int a=1;
int he=0;
for(int i=1;i<=n;i++)//循环n次
{
a=a*i;
he=he+a;
}
printf("%d个数各个数的阶乘和是:%d\n",n,he);
return 0;
}
结果是:
这里的循环很有趣,来分析一下:第一次:i=1,a=1*1=1,he=0+1=1;第二次:i=2,a=1*2=2,he=1+2=3;第三次:i=3,a=2*3=6;he=3+6=9;第四次:i=4,a=6*4=24,he=9+24=33。之所以有趣是因为这个循环反而利用了a不清空这一特点,直接让a接着乘,这样也能算出正确答案。文章来源:https://www.toymoban.com/news/detail-438829.html
文章来源地址https://www.toymoban.com/news/detail-438829.html
到了这里,关于C语言解决n的阶乘问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!