【整数大求余草稿】2022-3-7
88888888999999999999999999/198737927=
8888888899999999999/198737927=44726686215余51423694
514236949999999/198737927=2587512余179032375
还在玩字符串!早过时了,教科书也该改改了,int类型数组10万可容纳90万位数加减除法45万位乘法,若再配合其他措施可实现无限,速度远超字符串,代码也简洁。
void 整数大求余(_int64* 数, int 长, _int64 除数)
{//除数小于1E+18_int64 商 = 0, 调 = 0, 序 = 0, 被除 = 0, 模 = 1E+18, 取 = 1;while (数[序] == 0)++序;被除 = 数[序];if (序 < 长 - 1)调 = 数[++序];while (序 < 长){while (取 > 0 && 被除 < 模){if (调 > 0)被除 *= 10, 取 *= 10, 被除 += 调 / (模 / 取), 调 %= 模 / 取;else if (++序 < 长)调 = 数[序], 取 = 1;else取 = 0;}if (被除 >= 除数){商 = 被除 / 除数;// std::cout << "商" << 商;被除 = 被除 - 商 * 除数;}else;}std::cout << "余数" << 被除 << std::endl;
}_int64 a[10]{}, aal = 10000000, x = 0, p = 0;a[9] = 888888889999999999; a[8] = 888888888888888888; a[7] = 77774777;//整数逐位求余(a, 10, 198737927);整数大位求余(a, 10, 198737927);
void 整数逐位求余(_int64* 数, int 长, _int64 除数)
{//除数小于1E+18_int64 商 = 0, 调 = 0, 序 = 0, 被除 = 0, 模 = 1E+18, 取 = 1;while (数[序] == 0)++序;调 = 数[序];while (调 > 0 && 被除 < 除数)//特例反取合成顺序商 = (调 % 10) * 取, 被除 += 商, 取 *= 10, 调 /= 10;if (调 == 0 && 序 < 长 - 1)调 = 数[++序], 取 = 1;while (序 < 长){while (取 > 0 && 被除 < 除数){if (调 > 0)被除 *= 10, 取 *= 10, 被除 += 调 / (模 / 取), 调 %= 模 / 取;else if (++序 < 长)调 = 数[序], 取 = 1;else取 = 0;}if (被除 >= 除数){商 = 被除 / 除数; std::cout << "商" << 商;被除 = 被除 - 商 * 除数;}else;}std::cout << "余数" << 被除 << std::endl;
}
商补〇未处理;旋转制导确实不错但绝非不可瞄准,这时快速优秀的大数计算就发挥作用。梅森51个82589933求余=0?!运算后的位数经过计算是有24862048位,数组用量1381225,最前面一个数组存有16位数,1381224*18+16=24862048。能告诉我哪里错了?