数组实现大数阶乘
来源:互联网 发布:播放器 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.***********************************/