1

出力を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 に対して 1 回ではなく 2 回の型キャストを行う必要があるのはなぜでしょうか。

4

2 に答える 2