POJ 1001 高精度乘法加小數點處理

2021-07-15 05:22:20 字數 1694 閱讀 9650

剛接觸高精度不久,就去poj找了一道題做,這道題,其實不用寫成高精度乘高精度,可以把問題解析稱幾個小問題,逐一解決.首先注意到,他是冪運算,所以,而且原數字數固定為

6位,所以,只用寫高精度乘乙個低位數即可,而高精乘乙個6位數,可以解析乘高精乘乙個1位數,在相加 :a∗

123456=a

∗100000+a

∗20000+a

∗3000+a

∗400+a

∗50+a

∗6其次,還有小數如何處理,可以先移動原數的小數點使其為整數,得到的結果,在計算要移動的小數點位數,然後在移動還原

所以:可以分成幾個問題解決:

1.高精度加法

2.高精度稱乙個1位數

3.高精度成乙個多位數

4.多位數的冪相當於乙個高精不斷乘乙個多位數

5.小數點還原:記錄原數移動到成整數移動的小數點位數l,最終移動的位數為冪n∗

l 6.前導的0和末尾的0的消除,還要注意如果移動的小數點位數大於最後高精數字數,要在前面補0, 例如 123456789, 但要移動著12位, 則結果為0.000123456789

/*

name: 1001

author: boyce

date: 02/07/16 23:28

description:

*/#include#include

#include#includeusing namespace std;

string add(string a, string b)

for (int i = ret.size() - b.size() - 1; i >= 0; i--)

if (ret[0] == '0') ret.erase(0, 1);

return ret;

}string multiple_1(string a, int b)

if (ret[0] == '0') ret.erase(0, 1);

return ret;

}string multiple_2(string a, string b)

return ret;

}string power(string a, int n)

return ret;

}int main() else back = 0;

num = power(num, n);

if (back > 0)

}int cut_l = 0;

for (int i = 0; i < num.size(); i++)

num.erase(0, cut_l);

cut_l = 0;

for (int i = num.size() - 1; i >= 0; i--)

num.erase(num.size() - cut_l, cut_l);

if (num[num.size() - 1] == '.') num.erase(num.size() - 1, 1); // 針對這種特殊情況: 12.0 2 >> 144. >> 144

if (!num.empty()) cout << num << endl;

else cout << 0

<< endl; // num == "" >> cout << 0

}return

0;}

POJ 1001 高精度乘法

必須去掉前導0和後導0,乙個特殊資料是對000.00這樣的輸出0 include includeusing namespace std int main while n 2 如果小於2直接輸出 for int i 0 i dianwei i 從左往右去掉0 int lastindex 1 for i...

POJ 1001 高精度乘法

必須去掉前導0和後導0,乙個特殊資料是對000.00這樣的輸出0 include includeusing namespace std int main while n 2 如果小於2直接輸出 for int i 0 i dianwei i 從左往右去掉0 int lastindex 1 for i...

POJ 1001 求高精度冪

題目描述 對數值很大 精度很高的數進行高精度計算是一類十分常見的問題。比如,對國債進行計算就是屬於這類問題。現在要你解決的問題是 對乙個實數r 0.0 r 99.999 要求寫程式精確計算 r 的 n 次方 r n 其中n 是整數並且 0 n 25。解題思路 很簡單的一道高精度題目。話不多說直接上 ...