大数阶乘

来源:互联网 发布:康迪k10和知豆哪个好 编辑:程序博客网 时间:2024/06/05 05:15

大数阶乘

时间限制: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 20000void 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 20000using 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;}







 


1 0