/********************************************************************************* 思路:用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=2 Data[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=12 Data[0]=Data[1]%10=0 此时数组内容为 12 0 Data[2]=Data[2]+Data[1]/10=0+1=1 Data[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,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 120 factorial(10) is 3628800 factorial(20) is 2432902008176640000 factorial(30) is 265252859812191058636308480000000 Process returned 0 (0x0) execution time : 0.094 s Press any key to continue. ***********************************/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。