【发布时间】:2012-02-10 09:06:04
【问题描述】:
具体来说:我有两个无符号整数 (a,b),我想计算 (a*b)%UINT_MAX(UINT_MAX 定义为最大无符号整数)。最好的方法是什么?
背景:我需要为 linux 编写一个模拟几何序列的模块,从中读取将给我下一个元素(模 UINT_MAX),我找到的唯一解决方案是将当前元素添加到自身时间,而添加是使用以下逻辑完成的:(我用于算术序列)
for(int i=0; i<b; ++i){
if(UINT_MAX - current_value > difference) {
current_value += difference;
} else {
current_value = difference - (UINT_MAX - current_value);
}
当 current_value = a 在第一次迭代中(并且在每次迭代中更新,并且差异 = a(总是)。 显然这不是一个智能的解决方案。 一个聪明的人如何做到这一点?
谢谢!
【问题讨论】:
-
不允许使用取模运算符或8字节整数类型吗?
-
一个非常简单的愚蠢解决方案,其中“long long”是比 int 更长的类型。 long long 结果 = ((long long)a) * ((long long)b) % ((long long)UINT_MAX);
-
@JoachimIsaksson 结果不应该是 long long 类型,对吧?
-
您可能可以使用中国剩余定理。请参阅这些问题Restore a number from several its remainders 和 Sum and multiplication modulo
-
我正在寻找一种也适用于系统中“最大”数据类型的解决方案,因此不是使用“long long”。 @ypercube CRT 在这种情况下很难使用,因为 UINT_MAX=(2^n)-1,不是吗?
标签: c math multiplication modulo