2017-03-15 100 views
3

所以我遇到的問題是有兩個整數(a,b)在[1,10^16]區間內,我需要確定a^b會有多少個數字?這些數字太大而無法將它們保存在單個變量上,並且如果我將它們寫入Array,則需要很長時間。如何計算龐大數字的位數? C++

有沒有辦法用某種公式或任何簡單的方法計算數字a^b數字的數字然後數組?

+0

10個對數將給出位數。 – karakfa

+0

你是否在尋找一個有點準確,在球場,數量或確切的數字? –

+0

我只需要的是數字的位數,a^b的實際結果並不重要 – GaBoKaS

回答

1

karakfa的數字都有它的權利。

的鹼基k對數一些n的,四捨五入到最接近的整數,會給你的代表n在基地k需要的位數。

編輯:正如在評論中指出的那樣,它不應該向上取整,而是向下取整,然後遞增1。這佔了10位的額外數字。

如果您的號碼是a^b那麼以10爲底的對數log a^b並使用對數定律簡化爲b log a。請注意,此簡化發生在ceiling函數內部,因此簡化有效。計算log a應該不是問題(它將介於0和16之間),並且b是已知的。只要確保在相乘之後輪迴,而不是之前。

請注意,浮點數的有限精度可能會在此方法中引入一些錯誤。如果b x log a的真值與b x log a的最接近的浮點表示不同,它們落在整數的不同側,則該方法失敗。你可能會發現什麼時候你接近這種狀況並以某種方式修復它。

+1

@GaBoKaS查看Slava對karakfa的回答的評論:它應該是「floor()+ 1」而不是'ceiling「來解釋10的偶數冪。 – Patrick87

+0

順便說一下,在32位系統上計算它並不容易。因此需要64位系統。 – KonstantinL

0

您可以使用支持任意大數字的庫,如GMP

核心C++語言本身不提供任何類型來處理這麼大的數字。因此,無論是使用預先存在的庫還是自己編寫一個庫(我建議前者 - 不要重新發明輪子)。

+0

這完全是關於計算數位的數量,而不必實際存儲在內存中的數字。甚至可能是因爲即使使用100%的RAM也無法寫入。無論如何,您可能需要GMP來存儲代表數字量的數字:D – Criss

+0

是否有某種其他方式不需要下載任何東西? :) – GaBoKaS

6

固定一次性錯誤後的意見建議

一些a^b = floor(b * log(a)) + 1

+1

我認爲它應該是'floor()+ 1',否則它會給1 10 100等等 – Slava

+0

的錯誤值爲10,這個值將是整數,所以'ceil(n)== n' – karakfa

+0

Right so log(1)== 0,'ceil'也是0,這是否意味着需要0位數來存儲1?日誌(10)== 1等 – Slava