2010-04-02 72 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 
相關問題