我可以为C中的数据类型设置自己的限制吗?我正在解决一个涉及一些超大数的问题,我希望执行许多加法和乘法运算,并取模数为所需数值的最终结果,例如1537849。所以我想知道是否有可能重置数据类型的限制这样,当任何操作的结果超过我指定的数量时,值就自动取为我希望的数量的模,就像处理器通常所做的那样,但以我希望的限制为限。如果不可能做到这一点,那么解决这种问题的最有效方法是什么?
编辑:
考虑一个可能要计算(2 ^ 1000)%1537849并将结果放入变量monster
中。以下是我解决问题的尝试:
uint64_t monster = 1;
uint32_t power = 1000;
for (uint32_t i = 0; i < power; i ++ ) {
monster *= 2;
if (i%64==63) monster %= 1537849;
}
monster %= 1537849;
是否有更好的方法(不同的算法,使用库等等)?
答案 0 :(得分:3)
我可以为C中的数据类型设置自己的限制吗?
不,只需编写自己的编译器和库即可。
我正在解决一个涉及一些超大型数字的问题,这些数字很容易超出类型的限制
有一些算法可以处理零件中的大量数据……还有一些已经为您完成工作的库,例如看看GNU multi precision arithmetic library (GMP)。
答案 1 :(得分:3)
我可以为C中的数据类型设置自己的限制吗?
每个编译器对基本类型的限制是固定的。
我希望执行许多加法和乘法运算,并取模数为1537849的最终结果为模数
在加法和乘法的任何阶段,代码都可以重复执行模。如果原始数字是N位,则最多只需要N位数学运算-尽管使用2N位数学运算更容易。无限宽的数学效率很低,并且不需要此任务。
+
,*
和pow()
的示例代码,具有模数限制:
Modular exponentiation without range restriction
uintmax_t addmodmax(uintmax_t a, uintmax_t b, uintmax_t mod);
uintmax_t mulmodmax(uintmax_t a, uintmax_t b, uintmax_t mod);
uintmax_t powmodmax(uintmax_t x, uintmax_t expo, uintmax_t mod);