在比賽中經常可能接觸到高精度計算的問題,高精度演算法雖然不難,但是寫起來總是比直接用麻煩,於是我當時想了各種方法偷懶,想避免這個問題,當時最先想到的就是利用浮點型float 和double的高精度特性來代替高精度演算法。具體做法是先用乙個double型變數ans來計算並表示結果,然後把結果輸出時只顯示ans的整數部分。
以上偷懶的方法有時確實能夠僥倖成功,但是很多時候卻是以失敗告終,最後分析一下才發現失敗的原因:
以以下程式為例說明:
#include #include long long ans1;double ans2;
float ans3;
int main()
程式執行結果:
2^56運算結果:integer: 72057594037927936
double: 72057594037927936
float: 72057594037927936
2^57運算結果:
integer: 144115188075855872
double: 144115188075855870
float: 144115188075855870
可以看到當運算資料大於2^56時,就會出現結果偏差。查詢資料發現浮點數的運算本來就存在偏差,可能與機器內部儲存運算方式有關。所以float和double並不具備高精度運算的特性,希望後面跟我一樣想到這種偷懶方法的同學另闢蹊徑,去探索別的更高明的方法,不要在這裡浪費寶貴的時間了。
高精度計算
最近做了一些高精度計算問題,一般來說解題辦法都差不多,都是通過字串來操作的,下面是解題模板。清零操作 string clearstr string s if s return s 0 while s.length 0 s 0 0 s.erase 0,1 刪除第乙個零 if s return s 0 ...
高精度計算
include include includeusing namespace std const int l 110 string add string a,string b 只限兩個非負整數相加 nb l int la a.size lb b.size for int i 0 ilb la lb ...
高精度計算
一.高精度儲存 1.如對數採用的字串輸入 include include using namespace std const int n 100 最多100位 int main 2.直接讀入 include using namespace std const int n 100 最多100位 int...