我被迫将输出存储在一个unsigned int
数组中。但是,输出是数组中先前元素的线性组合的解,以2147483647 为模,即以2^31-1 为模。
下面是一个更大函数的代码片段。很快,这个片段会产生错误ii
的答案,因为它会围绕xx
. (请注意,xx
在调用函数之前播种,因此数组中没有元素为空。)
#include <stdint.h>
typedef unsigned int uint32;
typedef unit_least64_t uint64;
static uint32 xx[47];
...
xx[ii] = 12345 * (uint64)(xx[i0] + xx[ii]) % 2147483647; // i0, ii are defined elsewhere
但是,如果我们将最后一行与以下内容交换,我们将不断得到正确的解决方案。
xx[ii] = 12345 * ( (uint64)xx[i0] + (uint64)xx[ii] ) % 2147483647;
也许,这很明显,但是为什么需要对 unit64 进行两次类型转换而不是一次呢?