2012-08-23 96 views
3

我需要知道如何做這個程序。如何檢查數字是否可以在C#中整除?

calculation1: 1/4 = 0,25 
calculation2: 1/8 = 0,125 
calculation3: 47/183 = 0,25683060109289617486338797814207...... 
calculation4: 58/889 = 0,06524184476940382452193475815523...... 
calculation5: 1/5 = 0,2 

計算1,2和5的結果將提供一個短結果,沒有周期或與數字無窮字符串。計算結果3和4非常長且複雜。

如何檢查哪個計算是「簡單的」並給出「簡短」結果。

我試過這個,它給出了一個錯誤的結果,肯定... 就像你所看到的,計算結果在我的應用程序中有數據類型double

static bool IsInt(double x) 
    { 
     try 
     { 
      int y = Int32.Parse(x.ToString()); 
      return true; 
     } 
     catch 
     { 
      return false; 
     } 
    } 

我希望這是清楚我在問什麼。

+3

[每個計算機科學家應該知道的關於浮點算術](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – Oded

+5

準確定義您的數字存在標準'容易'和一個'不容易'的數字。您的代碼將以直接的方式進行操作。您所遇到的問題不是編碼,而是表達您的要求。 –

+2

你問的結果是否是一個理性的非理性的數字?或者只是它的短數字(它們都包含小數,所以我不確定你的意思是沒有期限) –

回答

16

如果儘可能減小分數後,分母可以表示爲2的乘方乘以5的冪,則小數表示終止。否則它會無限重複。

public bool IsGoodDivision(int a, int b) 
{ 
    while (b % 2 == 0) { b /= 2; } 
    while (b % 5 == 0) { b /= 5; } 
    return a % b == 0; 
} 

看到它聯機工作:ideone

注意,我分別傳遞的分子和分母的方法

如果你的部門是「好」,如下所示你可以測試。如果您先進行分區,然後將結果傳遞給您的方法,則由於浮點數representation error而失去精度。

此外,對於生產代碼,您應該檢查b != 0,因爲它不允許除以0.如果沒有檢查,上述代碼將進入無限循環。

+0

馬克是男人。 + 6K的答案,並沒有一個單一的問題 –

+0

+1的聰明。但是,考慮這個問題的技術含義不是更實際嗎?換句話說,這個比率是否會溢出數據類型? –

+0

輝煌!謝謝,每次都有新的東西可以學習! – Abi

相關問題