阶乘计算升级版 (20 分)
程序员文章站
2022-06-07 15:15:47
...
我牛哥教我的哦-/-
先看看算法吧
最下面是程序,里面有注释
题目 本题要求实现一个打印非负整数阶乘的函数。
函数接口定义:
void Print_Factorial ( const int N );
其中N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalid input”。
裁判测试程序样例:
#include <stdio.h>
void Print_Factorial ( const int N );
int main()
{
int N;
scanf("%d", &N);
Print_Factorial(N);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
15
输出样例:
1307674368000
void Print_Factorial(const int N)
{
if (N < 0)
printf("Invalid input");
else
{
//为什么定义a是4000呢,因为1000!正好是4000位左右,定义四百万也没事
int a[4000] = {0};//a数组就是放阶乘值的地方,是从后向前放的
int s; //放每个数字每位乘改乘的阶乘数的,具体看 手写图的s
int c = 0; //c是 “每个数字每位乘改乘的阶乘数的” 进位,比如42*8 (换下一行)
a[0] = 1; //分解一下就是2*8=16;最后一位(6)就是结果的个位数字,而1就是进位的数(此程序中用c来表示);(换下一行)
int i, j; //现在就是各位求完了,进位也知道了;然后就是4*8=32,咱们知道还有上一次的进位,所以32+1=33;最后的结果就是336;
//这个就是这个算法的核心思想
for (j = 2; j <= N; j++) //j是控制阶乘的大小,即从1乘到j -------//a[0]就相当于了乘阶的1;所以j从2开始就可以了(从1也没事)
{
c = 0; //每次把进位重置为0
for (i = 0; i < 4000; i++)
{
s = a[i] * j + c; //s就是数字的每位数乘当前阶乘的结果,s每次都不一样
a[i] = s % 10; //这个就是存的当前最新的数第(i+1)位的单个数字
c = s / 10; //c就是进位咯
}
}
for (i = 4000 - 1; i >= 0; i--) //因为4000是随便定义的,所以a数组中最后不一定有多少个0;要把0去掉再从后向前输出
if (a[i] != 0)
break;
for (; i >= 0; i--)
{
printf("%d", a[i]);
}
}
}
上一篇: PAT求自定类型元素的最大值