我可以为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;
有没有更好的方法(不同的算法,使用库,等等(??
我可以为C中的数据类型设置自己的限制吗?
基本类型的限制是每个编译器固定的。
我希望执行许多加法和乘法运算,并将最终结果取模,取某个所需的数字,比如1537849
在加法和乘法的任何阶段,代码都可以重复执行模运算。如果原始数字是N位的,则最多需要N位的数学运算——尽管使用2N位的数学比较容易。无限宽的数学是低效的,不需要这个任务。
具有模限制的+
、*
和pow()
的示例代码:
无范围限制的模幂
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);
我可以为C中的数据类型设置自己的限制吗?
不,除了编写自己的编译器和库。
我正在解决一些问题,这些问题涉及一些超级大的数字,这些数字很容易超过类型的限制
有一些算法可以处理零件中的巨大数字。。。还有一些库已经为您完成了这项工作,例如,看看GNU多精度算术库(GMP(。