C++小案例-利用数组计算n(防止溢出)
程序员文章站
2024-03-15 19:08:06
...
输入一个整数n,输出n!
//计算n!
//计算n!
#include<stdio.h>
int main()
{
int n=0;
scanf("%d",&n);
int num[300] = {1}, len = 0, rem = 0, i, j;
for(i = 2; i<=n; i++)//将每次的阶乘结果在数组中倒序存储,每次与i相乘之后与10求余个位留下,十位进到数组的下一位
{
for(j = 0; j <= len; j++)
{
rem += num[j] * i;
num[j] = rem % 10;
rem /= 10;
if(j == len && rem != 0) len++;//如果数组已满且rem中不为零则需要将数字长度加一
}
}
for(i = len; i >= 0; i--)//将数组倒序输出
printf("%d", num[i]);
return 0;
}
算法思想:
举个例子,比如说我们现在得到了4!= 24,在数组中是以倒序的方式存储,即42,a[0] = 4,a[1] = 2(数组下标从1开始),现在要计算5!
第一次循环:i=5,j=0,len=1,rem=0
rem=num[0]i+rem=45=20;
num[0]=rem%10=0;
rem=rem/10=2;
第二次循环:i=5,j=1,len=1,rem=2
rem=num[1]i+rem=25+2=12;
num[1]=rem%10=2;
rem=rem/10=1;
j==len=1且rem不为0
则len++
第三次循环:i=5;j=2;len=2,rem=1;
rem=num[2]i+rem=05+1=1;
num[2]=rem%10=1;
rem=rem/10=0;
所以倒序输出可得:120
上一篇: 求N的阶乘中末尾有几个0
推荐阅读