目錄
加法
減法
乘法
除法
高精度加法的步驟:
1.高精度數(shù)字利用字符串讀入
2.把字符串翻轉(zhuǎn)存入兩個(gè)整型數(shù)組A、B
3.從低位到高位,逐位求和,進(jìn)位,存余
4.把數(shù)組C從高位到低位依次輸出
????????1.2為準(zhǔn)備
vector<int> A, B, C;
string st1,st2;
cin >> st1 >> st2;
int len1 = st1.size(), len2 = st2.size();
for (int i = len1 - 1; ~i ; i--) A.push_back(st1[i] - '0');
for (int i = len2 - 1; ~i ; i--) B.push_back(st2[i] - '0');
? ? ? ? 3為加法具體實(shí)現(xiàn)(0按位取反為-1,即-1時(shí)結(jié)束等價(jià)于>=0)
void add(vector<int> A, vector<int> B, vector<int>& C) {
int t = 0, la = A.size(), lb = B.size();
for (int i = 0; i < la || i < lb; i++) {
if (i < la) t += A[i];
if (i < lb) t += B[i];
C.push_back(t % 10); //存余
t /= 10; //進(jìn)位
}
if (t) C.push_back(t); //最高位
}
? ? ? ? 4為結(jié)果輸出,翻轉(zhuǎn)輸入所以一定也要翻轉(zhuǎn)輸出!?。?/p>
for (int i = C.size() - 1; ~i; i--) cout << C[i];
測(cè)試
高精度減法的步驟:
1.高精度數(shù)字利用字符串讀入
2.把字符串翻轉(zhuǎn)存入兩個(gè)整型數(shù)組A、B
3.若A<B,則交換A,B,輸出負(fù)號(hào)
4.從低位到高位,逐位求差,借位,存差
5.把數(shù)組C從高位到低位依次輸出
1.2為準(zhǔn)備(和加法同理)
vector<int> A, B, C;
string st1,st2;
cin >> st1 >> st2;
int len1 = st1.size(), len2 = st2.size();
for (int i = len1 - 1; ~i ; i--) A.push_back(st1[i] - '0');
for (int i = len2 - 1; ~i ; i--) B.push_back(st2[i] - '0');
?3????????若A<B,則交換A,B,輸出負(fù)號(hào)
if (cmp(A, B)) swap(A, B), cout << '-';
若A<B返回true的比較函數(shù)cmp()
bool cmp(vector<int> A, vector<int> B) {
if (A.size() != B.size())
return A.size() < B.size();
for (int i = A.size() - 1; ~i; i--)
if (A[i] != B[i])
return A[i] < B[i];
//若A=B,返回false,避免給0加上負(fù)號(hào)
return false;
}
?4為減法的具體實(shí)現(xiàn)
void sub(vector<int> A, vector<int> B, vector<int>& C) {
int t, la = A.size(), lb = B.size();
for (int i = 0; i < la; i++) {
t = A[i];
if (i < lb)t -= B[i];
if (t < 0) A[i + 1]--, t += 10;//借位
C.push_back(t);//存差
}//C.back()返回最后一個(gè)元素,類似C[C.size()-1]
while (C.size() > 1 && !C.back()) C.pop_back();
}//高位連續(xù)的0沒有意義,需要去掉
5為結(jié)果輸出,翻轉(zhuǎn)輸入所以也一定要翻轉(zhuǎn)輸出?。。。ê图臃ㄍ恚?/p>
for (int i = C.size() - 1; ~i; i--) cout << C[i];
測(cè)試
高精度乘法的步驟:
1.高精度數(shù)字利用字符串讀入
2.把字符串翻轉(zhuǎn)存入兩個(gè)整型數(shù)組A、B
3.從低位到高位,累加乘積,進(jìn)位,存余
4.把數(shù)組C從高位到低位依次輸出
1.2為準(zhǔn)備(和加法、減法同理)
vector<int> A, B, C;
string st1,st2;
cin >> st1 >> st2;
int len1 = st1.size(), len2 = st2.size();
for (int i = len1 - 1; ~i ; i--) A.push_back(st1[i] - '0');
for (int i = len2 - 1; ~i ; i--) B.push_back(st2[i] - '0');
3
vector<int> mul(vector<int> A, vector<int> B) {
int la = A.size(), lb = B.size();
vector<int> C(la + lb, 0);
for (int i = 0; i < la; i++) {
for (int j = 0; j < lb; j++) {
C[i + j] += A[i] * B[j];//累加乘積
C[i + j + 1] += C[i + j] / 10;//進(jìn)位
C[i + j] %= 10;//存余
}
}//去掉高位無意義的0
while (C.size() > 1 && !C.back()) C.pop_back();
return C;
}
4
vector<int> C(mul(A, B));
for (int i = C.size() - 1; ~i; i--) cout << C[i];
測(cè)試(因?yàn)檫@個(gè)數(shù)據(jù)可以用計(jì)算器算。。。)
高精度除法的步驟:
1.高精度數(shù)字利用字符串讀入
2.把字符串翻轉(zhuǎn)存入整型數(shù)組A
3.從高位到低位,當(dāng)前被除數(shù),存商,求余數(shù)
4.把數(shù)組C從高位到低位依次輸出
1.2為準(zhǔn)備,注意只存被除數(shù)A
vector<int> A, C;
long long b;
string st1;
cin >> st1 >> b;
int len1 = st1.size();
for (int i = len1 - 1; ~i ; i--) A.push_back(st1[i] - '0');
3為除法實(shí)現(xiàn)
void div(vector<int> A, long long b, vector<int>& C) {
int la = A.size();
long long t = 0;
for (int i = la - 1; ~i; i--) {
t = t * 10 + A[i];//當(dāng)前被除數(shù)
C.push_back(t / b);//存商
t %= b;//余數(shù)
}//翻轉(zhuǎn)C,使無意義的連續(xù)0在C尾
reverse(C.begin(), C.end());
while (C.size() > 1 && !C.back()) C.pop_back();
}
4
for (int i = C.size() - 1; ~i; i--) cout << C[i];
測(cè)試
這實(shí)際是高精度除低精度。
真正的高精度除高精度:
1.高精度數(shù)字用字符串讀入
2.從高位到低位,逐位“試商”,存商,更新當(dāng)前被除數(shù)
3.翻轉(zhuǎn)輸出商
1
string st1, st2, st;
vector<int> C;
cin >> st1 >> st2;
2
string sub(string s, string st2) {
vector<int> A, B, C;
for (int i = s.size() - 1; ~i; i--) A.push_back(s[i] - '0');
for (int i = st2.size() - 1; ~i; i--) B.push_back(st2[i] - '0');
int t, la = A.size(), lb = B.size();
for (int i = 0; i < la; i++) {
t = A[i];
if (i < lb) t -= B[i];
if (t < 0) t += 10, A[i + 1]--;
C.push_back(t % 10);
}
string str;
while (C.size() > 1 && !C.back()) C.pop_back();
for (int i = C.size() - 1; ~i; i--) str += C[i] + '0';
return str;
}
bool cmp(string s, string st2) {
if (s.size() != st2.size())
return s.size() > st2.size();
for (int i = 0; i < s.size(); i++) {
if (s[i] != st2[i])
return s[i] > st2[i];
}
return true;
}
string div(string st1, string st2, vector<int>& C) {
string s;
for (int i = 0; i < st1.size(); i++) {
s += st1[i];//s>st2 -> true
int cnt = 0;
while (cmp(s, st2) && cnt < 10) {
s = sub(s, st2);
cnt++;
}
C.push_back(cnt);
}
reverse(C.begin(), C.end());
while (C.size() > 1 && !C.back()) C.pop_back();
return s;
}
3文章來源:http://www.zghlxwxcb.cn/news/detail-812994.html
st = div(st1, st2, C);
for (int i = C.size() - 1; ~i; i--) cout << C[i];
cout << '\n' << st;
順便算了余數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-812994.html
到了這里,關(guān)于高精度算法筆記·····························的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!