【二的次方数组,格式化18位不足左边补0】2022-2-22(草稿)

图片1251*18-16=22502位数字。我这个算法无论数据类型的位数是多少都可以应用起来,还有比我这分治法更好的方案?如果有的话可以超越我这个方案。

 

void 二的次方数组(_int64* 数, int 长, int 次)
{
	_int64 溢 = 0, 段 = 0, 乘数 = 0, 序 = 长 - 1, 模 = 1E+9;
	数[序] = 1;
	while (次)
	{
		if ((乘数 = 数[序]) > 0)
		{
			数[序] = (乘数 - 乘数 / 模*模) * 2 + 溢;
			溢 = 数[序] / 模;
			数[序] -= 溢*模;
			//cout << 数[序] << "\t" << 溢 << "\t";
			段 = (乘数 / 模) * 2 + 溢;
			溢 = 段 / 模;
			数[序] += (段 - 段 / 模*模)*模;
			//cout << 数[序] << "\t" << 溢 << "\t:";
			--序;
		}
		else
		{
			数[序] += 溢;
			序 = 长 - 1;
			溢 = 0;
			--次;
			//cout << 次 << "\n";
		}
	}
}
	_int64 a[10000]{}, aa[10]{}, al = 10000, aal = 10, x = 0, p = 0;
	clock_t 开始 = clock();
	二的次方数组(a, 10000, 74747);
	clock_t 结束 = clock();
	//a[9] = 999999999999999999;
	//a[8] = a[9];
	//aa[9] = 123456789;
	//aa[8] = aa[9];
	//整数大减法(a, aa, al, aal);
	while (x < al)if (a[x] || p)
        std::cout << setw(18) << setfill('0') << a[x], ++x, ++p; else ++x;
    std::cout << "\t" << p << "\n";

	_int64 a[100000]{}, aa[10]{}, al = 100000, aal = 10, x = 0, p = 0;
	clock_t 开始 = clock();
	二的次方数组(a, 100000, 747474);
	clock_t 结束 = clock();
	//a[9] = 999999999999999999;
	//a[8] = a[9];
	//aa[9] = 123456789;
	//aa[8] = aa[9];
	//整数大减法(a, aa, al, aal);
	while (x < al)if (a[x] || p)
		std::cout << setw(18) << setfill('0') << a[x], ++x, ++p;
	else ++x;
	std::cout << "\t" << p << "\n";

12501*18=225018位数,数组还很宽裕,数组可容纳1800000位数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值