2010-04-02 58 views
2

试图找出这个伪代码。以下是假设.... 我只能使用无符号和有符号整数(或长)。 除法返回一个没有余数的实数。 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

对不起,我不明白。什么是MOD? – John 2010-04-02 21:56:05

+0

MOD返回余数。所以,说我有6/4 DIV会返回1,而MOD会返回2.我需要在上面编辑我的答案...... 638对于MOD来说是不正确的。 :)刚才看到了。 http://en.wikipedia.org/wiki/Modulo_operation – 2010-04-02 22:00:12

回答

3

如果你要你的操作顺序切换上最后一行,你会得到答案的整数你正在寻找(9,如果我的计算是正确的)

D = (I * C)/65535 
/* D == 9 */ 

这就是你要找的答案吗?

+0

我认为这可能适用于我的目的。如果任何人在如我所描述的情况下确实有答案处理小数,我很乐意听到它。 – 2010-04-02 22:08:32

+0

我发布了一个处理小数的建议机制。不过,这真的很难看。 – Brian 2010-04-06 15:46:58

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函数)。保留我们认为是“十进制”部分的信息的唯一方法是通过可以从模数导出的余数。我强烈建议你不要混用这些不同号码系统的含义。整数只是整数。如果你需要它们是浮点数,你应该真的使用浮点数,而不是整数。如果所有你感兴趣的是向用户显示小数部分(即你没有真正使用它进​​行进一步计算),那么你可以编写一个例程来将余数转换为表示余数的字符串。

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 
相关问题