最近小白遇见了一位特别特别无聊的小黑黑,他竟然让我去算数学乘法,1*2*3*4*.....*9997*9998*9999?
但是这肯定是难不住小白的,小白脑子一动就用数组给完成了
阶乘
一:项目需求
1、对您所提交的阶乘代码,皇家山理数学院要求进行“中期”检查,要求能正确给出9999!的结果,请针对您的实现代码进行“测试”,根据测试结果,对您所提交的阶乘代码“质量”进行自我评价。
2、经过交流,皇家山理数学院所希望为能为公众提供Windows版本的大数阶乘计算服务,对任意输入的<=9999以内的整数能正确给出阶乘结果。根据这一明确需要,尝试完成软件的设计与实现,并就“可维护性”进行自我评价。
二:程序设计
阶乘会使得位数增长的非常快,比如20!的值的位数就已经要突破long long的上限了。所以常规的做法是处理不了的,要通过数组的方式来处理。当然这个数字本身不能超过int的范围,并且要提前预估这个数字的阶乘会有多少位。亲测10000以内都管用。
三:算法思想
初始化:array[0] = 1
STEP2:
从2开始乘,1*2 = 2,结果只有1位数,直接存到array[0]
STEP3:
2*3 = 6,结果只有1位数,直接存到array[0]
STEP4:
6*4 = 24,结果有2位数,2存到array[1],4存到array[0]
STEP5:
24*4 = 120,结果有3位数,1存到array[2],2存到array[1],0存到array[0]
四:程序代码
#include<bits/stdc++.h>
using namespace std;
#define MAXLENGTH 500000
int main()
{
int n;
while(cin >> n)
{
int* array = NULL;
array = (int*)malloc(MAXLENGTH*sizeof(int));
if(!array)
{
cout << "超出内存" << endl;
break;
}
else
{
array[0] = 1;
int digit = 1;//位数,随着计算不断更新
for(int i = 2;i <= n;i++)
{
int temp;
int carry = 0;//进位
for(int j = 0;j < digit;j++)//将一个数每一位都乘以i
{
temp = array[j]*i+carry;
array[j] = temp%10;//将一个数的每一位拆开存放到数组的每一位
carry = temp/10;
}
while(carry)
{
array[digit] = carry%10;
carry /= 10;
digit++;
}
}
while(digit >= 1) cout << array[--digit];//逆序输出
cout << endl;
}
free(array);
}
return 0;
}
五:结果表示
9999的阶乘太大了,但是我也要放上
28462596809170545189064132121198688901480514017027992307941799942744113400037644437729907867577847758158840621423175288300423399401535187390524211613827161748198241998275924182892597878981242531205946599625986706560161572036032397926328736717055741975962099479720346153698119897092611277500484198845410475544642442136573303076703628825803548967461117097369578603670191071512730587281041158640561281165385325968425825995584688146430425589836649317059251717204276597407446133400054194052462303436869154059404066227828248371512038322178644627183822923899638992827221879702459387693803094627332292570555459690027875282242544348021127559019169425429028916907219097083690539873747452483372899521802363282741217040268086769210451555840567172555372015852132829034279989818449313610640381489304499621599999359670892980190336998484404665419236258424947163178961192041233108268651071354516845540936033009607210346944377982349430780626069422302681885227592057029230843126188497606560742586279448827155956831533440534425446648416894580425709461673613187605234982286326452921529423479870603344290737158688499178932580691483168854251956006172372636323974420786924642956012306288720122652952964091508301336630982733806353972901506581822574295475894399765113865541208125788683704239208764484761569001264889271590706306409661628038784044485191643790807186112370622133415415065991843875961023926713276546986163657706626438638029848051952769536195259240930908614471907390768585755934786981720734372093104825475628567777694081564074962275254993384112809289637516990219870492405617531786346939798024619737079041868329