算法题目
-
其实这个求n的阶乘问题,我们在刚刚学习c语言的时候,应该就有大致的了解过了,那个时候我们可能会设置一个循环变量,或者使用递归方法,但是当n比较大时,我们会怎么做呢?
-
本文主要是将结果存放在int类型的数组中,然后每个单元存放6位数,整体思想还是采用我们小学时的竖乘法。
戳视频链接:n的阶乘问题视频讲解
再次声明:因为我本人主要是录着玩玩的,所以讲解时并没有备稿~
算法分析
-
输出结果时注意格式的控制,尤其是关于0的问题,因为int和char不太一样,如果结尾6个0,不控制好格式的话,可能就只剩下一个0了!!!
-
分析中,书上有一个地方印刷错误,应该是699238,不是699263!!!
-
竖式乘法我大致画了一个图帮助大家理解:
代码实现
#include<stdio.h>
//求n!
int main()
{
int s[256]; //用来存放运算结果
int n; //用来输入求谁的阶乘
int d; //用来表示进位
int b; //用来表示临时结果
int m=1; //用来表示占用数组的单元个数
int i,j,k; //循环变量 i表示运算数循环变量 j表示运算结果数组循环变量 k表示输出控制循环变量
s[1]=1;
printf("请输入你想求哪个数(n)的阶乘:\n");
scanf("%d",&n);
for(i=2;i<=n;i++)
{
d=0;
for(j=1;j<=m;j++)
{
b=s[j]*i+d;
s[j]=b%1000000;
d=b/1000000;
}
if(d!=0)
{
m++;
s[m]=d;
}
}
printf("%d ",s[m]);
for(k=m-1;k>=1;k--)
printf("%06d ",s[k]); //因为int不比char,所以控制0需要注意
return 0;
}
结果示例
- 示例一
- 示例二
- 示例三