试图找出这个伪代码。假设如下...... 我只能使用无符号和有符号整数(或长整数)。 除法返回一个没有余数的实数。 MOD返回一个实数。 不处理分数和小数。
INT I = 41828;
INT C = 15;
INT D = 0;
D = (I / 65535) * C;
在这种情况下,您如何处理分数(或小数值)?有没有办法用负值来表示余数?
在这个例子中,I / 65535应该是0.638,但是,有了这些限制,我得到0,MOD为638.我怎样才能乘以C得到正确答案?
希望这是有道理的。
MOD这里实际上会返回23707,而不是638.(我希望我是对的:))
答案 0 :(得分:3)
如果您要在最后一行切换操作顺序,您将得到您正在寻找的整数答案(9,如果我的计算是正确的)
D = (I * C) / 65535
/* D == 9 */
这是你正在寻找的答案吗?
答案 1 :(得分:0)
假设这些是你一直用于此计算的值,那么我会做类似的事情:
D = I / (65535 / C);
或
D = I / 4369;
因为C是65535的因子。这将有助于减少超出可用整数范围的可能性(即,如果你只有16位无符号整数)。
在更一般的情况下,如果您认为存在I和C的乘法将导致超出您正在使用的整数类型的允许范围内的值的风险(即使最终结果将在范围)你可以将分子和分母的GCD分解为:
INT I = 41828; INT C = 15; INT DEN = 65535; INT GCDI = GCD(I, DEN); DEN = DEN / GCDI; I = I / GCDI; INT GCDC = GCD(C, DEN); DEN = DEN / GCDC; C = C / GCDC; INT D = (I * C) / DEN;
DEN是你的分母(在这种情况下是65535)。在所有情况下,这都不会为您提供正确的答案,特别是如果I和C都与DEN和I * C相互作用的话。 MAX_INT。
至于你提出的更大的问题,整数值的除法将总是松散小数部分(相当于floor函数)。保留我们所认为的“十进制”部分中包含的信息的唯一方法是通过可以从模数得出的余数。我强烈建议你不要混淆这些不同数字系统的含义。整数只是整数。如果你需要它们是浮点数,你应该使用浮点数,而不是整数。如果你有兴趣做的就是向用户显示小数部分(即你没有真正用它来进行进一步的计算),那么你可以编写一个例程来将余数转换成代表余数的字符串。
答案 2 :(得分:0)
嗯,处理小数的一种方法是使用替换除法函数。这种技术有许多明显的缺点。
ALT DIV (dividend, divisor) returns (decimal, point)
for point = 0 to 99
if dividend mod divisor = 0 return dividend / divisor, point
dividend = divident * 10
return dividend / divisor, 100