原理:简单来说就是数组每单元存放9位数字,多于9位的当作进位处理,乘法把每单元当作平常一位数运算看待即可。普通的INT类型10万数组每元素存9位数约容纳90万位数,如果把尾部0移出来的话,容纳更多位数,尾部0可以使用科学计数法表示,尾部0移出将在运算过程中同时进行数组位移,暂时做到100000!乘法,且尾部0暂时未写移位,10万数组9位约能运算到186121!,以本例来说移出约5万个0,则约5万+90万总约可容纳95万位数据,尾部0移出后可运算到195370!,1E+46521。
void INT类大数阶乘(int j)
{
int mo = 1e+9, ds[100000]{}, n = 0, je = 1, jw = 0, x = 99999, wi = x;
_int64 ji = 0;
ds[99999] = 1;
while (ds[0] == 0 && je <= j)// && je < mo
{
while (ds[x] > 0 || x > wi)//尾部0运算
{
ji = ds[x]; ji *= je; ji += jw; jw = 0;//必须赋值出来否则变为INT类型
if (ji >= mo)
{ ds[x] = ji % mo; jw = ji / mo; }
else ds[x] = ji;
--x;
if (wi > x) wi = x; else;
}
if (jw > 0) { ds[x] += jw; jw = 0; } else;
x = 99999; ++je;
}
cout << --je << "!" << wi << ":"; je = 0;
while (wi < 1e+5)
if (ds[wi] > 0 || jw > 0)
if (jw > 0)
if (ds[wi] > 0){ cout << setw(9) << setfill('0') << ds[wi], ++wi; }
else if (ds[wi] == 0){ ++je, ++wi; }
else { ++wi, cout << "x_x"; }
else { cout << ds[wi], ++wi, ++jw; }
else ++wi;
cout << "\t0的位数" << je*9 << "\n";
}
if (ds[x] == 0)//尾部0位移
{
while (yi > 0 && yi > wi)ds[yi] = ds[yi - 1], --yi;
++kj; yi = 99999;
}
else;//195370.48834 186120.5170.46521 186121.46521
void INT类大数阶乘(int j)
{
int mo = 1e+9, ds[100000]{}, n = 0, je = 1, jw = 0, x = 99999, wi = x, kj = 0, yi = 0;
_int64 ji = 0;
ds[99999] = 1;
while (ds[0] == 0 && je <= j && je < mo)//
{
while (ds[x] > 0 || x > wi)//尾部0运算
{
if (yi > 0 && x > 0) ds[x] = ds[x - yi]; else;//位移
ji = ds[x]; ji *= je; ji += jw; jw = 0;//必须赋值出来否则变为INT类型运算
if (ds[x] < 0)cout << "x_x"; else;
if (ji >= mo)
{ ds[x] = ji % mo; jw = ji / mo; }
else ds[x] = ji;
--x;
if (wi > x) wi = x; else;
}
if (jw > 0) { ds[x] += jw; jw = 0; if (ds[x] < 0||ds[x] >= mo)cout << "x_x"; else; } else;
x = 99999; ++je;
if (ds[x] == 0) { ++kj; yi = 1; } else yi = 0;//尾部0位移
}
cout << --je << "!" << wi << "序,0的位" << kj * 9 << "数"; je = 0;
while (wi < 1e+5)
if (ds[wi] > 0 || jw > 0)
if (jw > 0)
if (ds[wi] > 0){ cout << setw(9) << setfill('0') << ds[wi], ++wi; }
else if (ds[wi] == 0){ ++je, ++wi; }
else { ++wi, cout << "x_x"; }
else { cout << ds[wi], ++wi, ++jw; }
else ++wi;
cout << "\t0的位数" << je * 9 << "\n";
}
借用递归法求n!的问题,为什么我写的程序到13以后计算结果就不对了-编程语言-CSDN问答
例子核对我的程序1000!是否正确,每行0的个数80个。