首页 > 学院 > 开发设计 > 正文

大数阶乘

2019-11-06 07:10:04
字体:
来源:转载
供稿:网友
#include <iostream>#include <cstring>#include <time.h>using namespace std;#define MAXSIZE 80000                                             //定义数组大小int a[MAXSIZE];void factorial(int n)                                             //阶乘转化为模拟手算函数{clock_t total,dwStart,dwEnd;                                  //计算函数执行时间(单位ms,输入n太小会导致精度不够)dwStart = clock();                                            //获取cpu当前时钟memset(a, 0, sizeof(a));                                      //数组清零a[0] = 1;                                                     //a[0]设为1,同时满足计算0的阶乘int i, j, temp, sum, ep = 1;                                  //定义i为外层阶数循环,j为内层数组位循环,temp为数组每一位的进位,sum为数组每一位经计算的结果,ep为数组内层循环次数(数组用到的估值有效位数)for (i = 2; i <= n; i++)                                      //外层阶数循环,0和1的阶乘直接得出结果为a[0]=1{temp = 0;                                                 //进位置0if (i<20)                                                 //20阶以内,每次数组乘阶数后另ep(用到的估值有效位数)加1{                                                         for (j = 0; j<ep; j++)                                //内层数组循环,每一位的结果等于其值乘阶数再加上前一位的进位得到的值对10求余,进位用对10取商得到{sum = a[j] * i + temp;a[j] = sum % 10;temp = sum / 10;}ep++;}else if (i >= 20 && i<200)                                //20阶至200阶以内,每次数组乘阶数后另ep加2{for (j = 0; j<ep; j++){sum = a[j] * i + temp;a[j] = sum % 10;temp = sum / 10;}ep += 2;}else if (i >= 200 && i<2000)                              //200阶至2000阶以内,每次数组乘阶数后另ep加3{for (j = 0; j<ep; j++){sum = a[j] * i + temp;a[j] = sum % 10;temp = sum / 10;}ep += 3;}else if (i >= 2000 && i <= 20000)                         //2000阶至20000阶以内,每次数组乘阶数后另ep加4{for (j = 0; j<ep; j++){sum = a[j] * i + temp;a[j] = sum % 10;temp = sum / 10;}ep += 4;}                                                         //20000阶以后需修改MAXSIZE大小,ep变化规律顺延}dwEnd = clock();                                              //获取cpu当前始终total = dwEnd - dwStart;                                      //计算函数执行时间cout << "计算用时"<<total << "ms" << endl;for (i = ep; i >= 0; i--)                                     //忽略实际位数到ep位前面的0{if (a[i])break;}for (j = i; j >= 0; j--)                                      //倒序输出阶乘cout << a[j];cout << endl;}int main(){int n;cout << "*********************大数阶乘程序*********************/n/n";do {cout << "请输入你想求的阶乘数,输入负数退出/n";cin >> n;if (n<0)break;factorial(n);} while (n >= 0);return 0;}

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表