我寫了這個函數來計算並返回傳遞給函數的數字的位數或長度。它的工作效果很好,直到您告訴它計數超過10位數字的數字。在這些情況下,它只返回1.爲什麼這個函數不會超過10位數?
int digits(int z)
{
int counter = 1;
for (double y = 9; z > y; y = (y*10) + 9)
{
counter++;
}
return counter;
}
我寫了這個函數來計算並返回傳遞給函數的數字的位數或長度。它的工作效果很好,直到您告訴它計數超過10位數字的數字。在這些情況下,它只返回1.爲什麼這個函數不會超過10位數?
int digits(int z)
{
int counter = 1;
for (double y = 9; z > y; y = (y*10) + 9)
{
counter++;
}
return counter;
}
整數最有可能是目標機器上的32位。如果有符號,整數的值在(大約)-2億到+20億之間。任何一個極端都是10位數字。
您可以更改您的代碼以使用64位整數來獲得更多里程。否則,您需要使用自定義表示(即編寫您自己的大整數類)以允許任意大的數字。
怎麼會寫這樣的課? @Steven Hansen – Svihuroid
這可能是另一篇文章的主題。它通常涉及以某種方式存儲單個數字的數組。 –
4字節的範圍int是從–2,147,483,648
到2,147,483,647
如果指定2,147,483,647扣除任何正數,那麼它將別的指望它會返回1.
我想你應該檢查的範圍內。 至於它是-2,147,483,648至2,147,483,647 任何小於下限的數字,即-2,147,483,648或任何大於上限的數值,即2,147,483,647將產生1結果。你已經在問題中指定了。 click here瞭解詳情。
你在你的代碼問題:
爲了解決1: 你需要一個絕對值:INT U = STD: :ABS(Z)。
注意:最大負數的絕對值沒有定義。
地址2 .: 增加計數器並減少u如果10 < = u。之後,你可以用int y和u來使用你的循環。
另外:最有可能要執行的傳遞負數,由於溢流出的乘法我能知道什麼號,未能通過測試的10
? 並確保你沒有越過C++中允許的int範圍。 –
實際上你不能告訴這個函數用這麼大的數字做任何事情,因爲你不能傳遞這麼大的數字。 –
我想我明白了。如果我將這個函數和它的參數聲明爲雙重意志,那麼這個函數有效嗎? – Svihuroid