数组实现大数阶乘

来源:互联网 发布:播放器 p2p m3u 网络 编辑:程序博客网 时间:2024/05/19 05:40
/*********************************************************************************思路:用Data数组来存放阶乘的每一位数字,首先令第一位的数值为1,位数为1,然后将每次相乘的乘积存回数组,并循环处理每个数组中超过10的数,若数值超过10,则需要进位,将位数加1,原来的数除以10,商数加前一位数的数值后存回前一位数的数组中,再将余数存回原来位数的数组中。例如求5!的值步骤一:1!=1位数1数组内容 1步骤二:2!=2*1!=2位数1数组内容 2步骤三:3!=3*2!=3*2=6位数1数组内容 6步骤四:4!=4*3!=4*4=24位数1数组内容 24因为24大于10,需要进位Data[1]=Data[1]+Data[0]/10=0+2=2Data[0]=Data[0]%10=4所以数组内容为 2 4位数2步骤五:5!=5*4!=5*24=120位数2数组内容为 2*5 4*5即 10 20因为Data[0]大于10,需要进位Data[1]=Data[1]+Data[0]/10=10+2=12Data[0]=Data[1]%10=0此时数组内容为 12 0Data[2]=Data[2]+Data[1]/10=0+1=1Data[1]=Data[1]%10=2位数加1数组内容为 1 2 0依此类推,可以计算大数的阶乘。******************************************************************/#include<iostream>#include<cstdio>#include<string.h>#include<string>using namespace std;#define MAX 100//MAX 是计算结果的最大位数 取为100位void factorial(int n,char output[]){    int i, j, cin, tmp;    int result[MAX];    memset(result, 0, sizeof(result)); //初始化为0    result[0] = 1;    for(i = 2; i <= n; ++i)  //从2 开始计算阶乘    {        cin = 0; //进位初始化为0        for(j = 0; j < MAX; ++j)        {            tmp = result[j] * i + cin; //cin进位            result[j] = tmp % 10;            cin = tmp / 10;        }    }    for(i = MAX - 1; i >= 0; --i) //忽略前导的0        if(result[i]) break;    for(j = i; j >= 0; j--)   //将结果倒叙打印在结果数组中    sprintf(output++,"%d", result[j]);    //注意sprintf的第一个参数是char型指针}int main(){    char out[MAX]={0};    int i=5;    factorial(i,out);    cout<<"factorial("<<i<<") is "<<out<<endl;    i=10;    factorial(i,out);    cout<<"factorial("<<i<<") is "<<out<<endl;    i=20;    factorial(i,out);    cout<<"factorial("<<i<<") is "<<out<<endl;    i=30;    factorial(i,out);    cout<<"factorial("<<i<<") is "<<out<<endl;}/**********************************factorial(5) is 120factorial(10) is 3628800factorial(20) is 2432902008176640000factorial(30) is 265252859812191058636308480000000Process returned 0 (0x0)   execution time : 0.094 sPress any key to continue.***********************************/

原创粉丝点击