c++程式設計中,常會處理一些大數的操作,例如冪指數計算,組合數計算,大數之間的加減法等。
大數通常的處理就是當作字串或者陣列,然後對每一位進行操作。舉簡單的加法來說,就是從低位逐位相加,大於等於10的進製。這裡在儲存大數時,遵循低位在前,高位在後的方式,這樣方便取資料。
字元反轉程式:
char* strreverse(const char* str)
return tmp;
}
大數相加程式:
string bigdataadd(string num1, string num2)
return strreverse(result.c_str());
}
大組合數處理:對於有n 個元素的集合,隨機取k 個的組合數為二項式公理係數c(n, k),詳見
其公式如下:
這裡就概率組合問題舉一例,某人射擊運動中射中的概率為p,求在n 次射擊中射中k 次的概率。
當n 很小時,普通double型別還能儲存n!,但是n > 100或者更大時,所有已知型別都沒有足夠大儲存n!。
對於n=100,k=50來說其組合數是相當的大。採用對數形式將其變小:
容易看出不僅我們的目的達到了,其運算速度也提公升了,只算加法。
/**********************************
calculate binomial expression p(c(n, k))=c(n, k) * p^k * p^(n-k),
its' deformation is exp(ln(c(n, k)) + k * ln(p) + (n - k) * ln(n - k))
where c(n, k) = c(n, n - k), it can reduce computation, too.
**********************************/
double prob(int n, int k, double p)
大數的處理
一般情況下,如果涉及到大數問題一般都會採用字元陣列來解決,在使用字元陣列時,需要注意的問題 1.首先宣告整數陣列,陣列中的每個元素都當做單獨的數字進行運算.2.陣列的初始化,根據計算型別的不同初始化操作也不同 3.每個陣列元素進行運算完畢後,必須進行進製處理,進製時原有數字與進製 a i 1 a i...
大數的處理
參考 ac 如下 include include using namespace std 大數相乘 string bigintegerplus string res,string plusn int len1 res.length len2 plusn.length for int i len2 1...
處理大數字
處理大數字 高精度浮點數bigdecimal 它可以表示任意精度的小數,並對它們進行計算 由於bigdecimal物件是不可變的,這些方法中的每乙個都會產生新的bigdecimal物件 因此,因為建立物件的開銷,bigdecimal不適合於大量的數學計算,但設計它的目的是用來 精確地表示小數 pub...