大数阶乘
时间限制:3000 ms | 内存限制:65535 KB
难度:3
-
描述
-
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
-
输入
- 输入一个整数m(0<m<=5000) 输出
- 输出m的阶乘,并在输出结束之后输入一个换行符 样例输入
-
50
样例输出
-
30414093201713378043612608166064768844377641568960512000000000000
现在,我们就要介绍一种计算方法,该方法的主要思路如下:
1.开辟一个大小足够大的整形数组;
2.数组的每一个元素只保存计算结果中的一位数字,数组索引最小的元素对应计算结果的最小位,依次类推;
3.在计算中,将1-n中的每一个数字都与数组中的每一个数相乘,将与某元素的乘积仍保存在该元素中;
4.在1-n中的每个数字与所有元素做完乘积之后,依次每一个元素中的数字是否超过10(或者radix),若超过,则向前进位;
按照上面所描述的算法,我们在这里利用C++语言进行了实现:
#include <iostream> #include <memory.h> using namespace std; #define MAX_INPUT_BIT 5000 #define MAX_ARRAY_BIT 20000 void Carry(int &d_bit,int *arr){ int cvalue = 0,i; for(i=0;i<=d_bit;i++){ arr[i] += cvalue; cvalue = arr[i]/10; arr[i] = arr[i]%10; } arr[i] = cvalue; d_bit++; while(cvalue>=10){ arr[i++] = cvalue%10; cvalue = cvalue/10; arr[i] = cvalue; d_bit++; } } void output(int db,int *arr){ for(int i=db;i>=0;i--){ cout<<arr[i]; } cout<<endl; } void BigMutiplay(int *arr,int input_bit){ arr[0] = 1; int digit_bit = 0; for(int i=2;i<=input_bit;i++){ for(int j=0;j<=digit_bit;j++){ arr[j] *= i; } Carry(digit_bit,arr); } output(digit_bit,arr); } int main(){ int input_bit; cin>>input_bit; int array[MAX_ARRAY_BIT]; memset(array,0,sizeof(array)); BigMutiplay(array,input_bit); return 0; }
一种简化过的代码:
#include <iostream>
#include <string.h>
#define MAX_NUMBER_BIT 20000
using namespace std;
int array[MAX_NUMBER_BIT];
int main(){
int input;
cin>>input;
memset(array,0,sizeof(array));
array[0] = 1;
int i,j;
for(i=2;i<=input;i++){
int carry=0;
for(j=0;j<=MAX_NUMBER_BIT;j++){
array[j] = array[j]*i+carry;
carry = array[j]/10;
array[j] = array[j]%10;
}
}
for(j=MAX_NUMBER_BIT;j>=0;j--)
if(array[j])
break;
for(i=j;i>=0;i--){
cout<<array[i];
}
cout<<endl;
return 0;
}