【发布时间】:2016-03-21 06:59:41
【问题描述】:
我正在尝试将非常大的数字(>100 位)从字符串转换为 Zn 加法组(模 n)中的整数。 n 保证在标准 C int 范围内(比如 n=12345)。
atoi then "%" 的简单方法和 BigIntiger 在这里都不起作用。
有什么想法可以实现吗?
【问题讨论】:
-
久经考验的逐位转换算法,再加上
(a + b) mod n = ((a mod n) + (b mod n)) mod n,乘法也是如此。 -
您唯一剩下的问题是您将要编写
answer = ((answer * 10)%n + digit)%10;,并且如果 n > MAXINT/10,则乘法可能会溢出。 (如果 n 为 > MAXINT/2,即使通过重复添加(answer+answer)%n也会溢出)。 -
@MartinBonner,这是使用
<cstdint>中具有显式大小的类型的充分理由 -
你想用 C 还是 C++ 来做这个?它们不是同一种语言,可能有不同的解决方案。请选择一个。
-
没关系,但没必要使用
<cstdint>(C++) 或stdint.h(C) 类型。所有标准整数类型(char、short、int、long、unsigned、long long等)都具有最小范围保证 - 尽管允许实现支持比要求的标准。如果您知道n的上限,请选择一种保证能够表示至少两倍该值的类型。如果n对于标准类型来说太大了,请查找“大整数”库类型或类似的东西。
标签: c++ c type-conversion algebra abstract-algebra