为什么变量不被新值覆盖

时间:2019-10-01 18:39:11

标签: c#

我正在尝试制作一个具有数学功能的简单控制台应用程序。

我的问题是在MakeFirstStageCalculations的{​​{1}}循环中,余数不会被新的余数覆盖,我在这里错过了什么?

while

如果当前的解释还不够,我愿意在评论中详细说明。

正确的前4个数字是:

1092455

1181022009

245556042

1744312007

根据任务,公式为:

  1. 用户输入值(65)乘以系数(16807);

  2. 相乘的结果除以(2147483647);

  3. 结果是除法残差;

  4. 该结果成为下一次迭代的初始编号。

我写错公式了吗?

1 个答案:

答案 0 :(得分:1)

主要问题是您不将计算出的余数用作下一次迭代的新起始值。起始值保存在变量value中,并且变量multiplicationValue仅计算一次。之后,您要计算剩余的部分,每次迭代都将是相同的。您正在计算的是类似

42 % 100 = 42

相同
((((42 % 100) % 100) % 100) % 100) = 42

因为您每次只能用42 % 100替换42

您需要使用计算出的新余数再次触发初始乘法。代码应如下所示:

int startValue = 65;
int coefficient = 16807;
int divisor = 2147483647;

int iterationValue = startValue; // (2)
for (int i=0; i<10; i++) {
    long multipliedValue = (long)iterationValue * (long)coefficient;
    int remainder = (int)(multipliedValue % divisor);
    Console.WriteLine(i+": "+remainder);
    iterationValue = remainder;  // (1)
}   

for循环仅用于测试,请在代码中使用while循环)

变量iterationValue将包含新的迭代值,并在循环的末尾包含计算出的余数(标记为(1)),并将使用原始的起始值(标记为{{1 }},在这种情况下为(2))。运行此代码时,您将获得以下输出:

65

如您所见,您会在顶部找到前四个通缉值。

第二个问题是您仅使用/ used类型0: 1092455 1: 1181022009 2: 245556042 3: 1744312007 4: 1352636452 5: 498961622 6: 124339419 7: 271026602 8: 331284527 9: 1621432265 进行计算。这可能会导致问题。第一次迭代后,您将要计算乘法值int,即1092455 * 16807。但是,此值不适合18360891185变量。您会得到一个所谓的“整数溢出”,这将导致一个负值。仅使用整数类型/值,您将得到以下输出:

int32

通过在正确的位置将值/类型更改为0: 1092455 1: 1181022001 2: -1902071305 3: -670839007 4: -502038649 5: 1847162897 6: 1243194391 7: -647765503 8: 747286439 9: 1158806769 ,您可以进行乘法和余数计算而不会得到负值。您可能还想考虑使用BigInteger值来避免此问题。