2014-01-10 64 views
0

我寫了這個函數來計算並返回傳遞給函數的數字的位數或長度。它的工作效果很好,直到您告訴它計數超過10位數字的數字。在這些情況下,它只返回1.爲什麼這個函數不會超過10位數?

int digits(int z) 
{ 
    int counter = 1; 
    for (double y = 9; z > y; y = (y*10) + 9) 
    { 
    counter++; 
    } 
return counter; 
} 
+0

? 並確保你沒有越過C++中允許的int範圍。 –

+1

實際上你不能告訴這個函數用這麼大的數字做任何事情,因爲你不能傳遞這麼大的數字。 –

+0

我想我明白了。如果我將這個函數和它的參數聲明爲雙重意志,那麼這個函數有效嗎? – Svihuroid

回答

2

整數最有可能是目標機器上的32位。如果有符號,整數的值在(大約)-2億到+20億之間。任何一個極端都是10位數字。

您可以更改您的代碼以使用64位整數來獲得更多里程。否則,您需要使用自定義表示(即編寫您自己的大整數類)以允許任意大的數字。

+0

怎麼會寫這樣的課? @Steven Hansen – Svihuroid

+0

這可能是另一篇文章的主題。它通常涉及以某種方式存儲單個數字的數組。 –

1

4字節的範圍int是從–2,147,483,6482,147,483,647

如果指定2,147,483,647扣除任何正數,那麼它將別的指望它會返回1.

0

我想你應該檢查的範圍內。 至於它是-2,147,483,648至2,147,483,647 任何小於下限的數字,即-2,147,483,648或任何大於上限的數值,即2,147,483,647將產生1結果。你已經在問題中指定了。 click here瞭解詳情。

0

你在你的代碼問題:

  1. 不考慮負值
  2. 使用浮點

爲了解決1: 你需要一個絕對值:INT U = STD: :ABS(Z)。

注意:最大負數的絕對值沒有定義。

地址2 .: 增加計數器並減少u如果10 < = u。之後,你可以用int y和u來使用你的循環。

另外:最有可能要執行的傳遞負數,由於溢流出的乘法我能知道什麼號,未能通過測試的10

相關問題