我正在尝试制作一个具有数学功能的简单控制台应用程序。
我的问题是在MakeFirstStageCalculations
的{{1}}循环中,余数不会被新的余数覆盖,我在这里错过了什么?
while
如果当前的解释还不够,我愿意在评论中详细说明。
正确的前4个数字是:
1092455
1181022009
245556042
1744312007
根据任务,公式为:
用户输入值(65)乘以系数(16807);
相乘的结果除以(2147483647);
结果是除法残差;
该结果成为下一次迭代的初始编号。
我写错公式了吗?
答案 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
值来避免此问题。