【INT类大数阶乘100000!草稿】2022-5-26

原理:简单来说就是数组每单元存放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个。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值