阶乘计算升级版
题目:本题要求实现一个打印非负整数阶乘的函数。
函数接口定义:
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
解题思路:这里很明显是不能使用long long等长整型去做,因为已经超过long long的范围了,我们需要使用数组来存放结果。
思路是这样的:定义一个整型数组,然后将结果按位数从arr[0]按顺序存放。
比如:
2的阶乘:arr[0] = arr[0]*2+进位数,此时进位数为0,arr[0]存放的是2
3的阶乘:arr[0] = arr[0]*3+进位数,此时进位数为0,arr[0]存放的是6
4的阶乘:arr[0] = arr[0]*4+进位数,此时,结果是12,因此进位数是1,arr[0]存放的12%10 ==2,arr[1] = 1.
5的阶乘:arr[0] = arr[0]*5+进位数,,进位数为2,arr[0] = 0.arr[1]*5+进位数。此时arr[1] = 2,进位数是1,arr[3] = 1。所有结果是120。
void Print_Factorial ( const int N ) { if(N<0) { printf("Invalid input"); } else{ int arr[10000] = {0}; arr[0] = 1; int carray = 0;//记录进位数 int digitcapacity = 0;//用来记录位数 int n = N; int j = 0,i = 0; for(i = 2;i<=n;i++) { for(j = 0;j<=digitcapacity;j++) { int tmp = arr[j]*i+carray; arr[j] = tmp%10; carray = tmp/10; } while(carray) { arr[j++] = carray%10; carray/=10; digitcapacity++; } } for(;digitcapacity>=0;digitcapacity--)//逆向打印 { printf("%d",arr[digitcapacity]); } } }