我有像
这样的代码for(...)
{
K=K*X; //X is some equation
answer=answer+K%C;
}
变量answer
是我感兴趣的,而K只是一个中间值。如您所见,我只对K%C
而非K
感兴趣。但我不能在for循环中K=K%C
,因为它会给出错误的结果。但是目前K值增长非常快并且溢出。
我怎么能控制K的值而不会得到错误的结果呢?
答案 0 :(得分:4)
您可以利用身份
ab mod n = (a mod n)(b mod n) mod n
将K = K * X;
替换为K = ((K % C) * (X % C)) % C;
然后answer = answer + K % C;
变为answer += K;
答案 1 :(得分:2)
试试这个:
K = K%C;
for (...)
{
K = K*X%C;
answer = answer+K;
}
答案 2 :(得分:0)
还无法对其他答案发表评论,但我认为循环外K = K%C;
的初始化不正确。只需循环即可。
for( ... )
{
K=K*X%C;
answer=answer+K;
}
为什么这样做的原因是没有必要在K内累积C的额外倍数。假设K是第一次迭代,并且K'是下一次迭代,然后K&n; * X =(K / C)* X +(K%C)* X.所以我们可以在每次迭代中删除(K / C)* X部分。