图片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位数。