C++高精度算法的使用場(chǎng)景詳解
描述
如果要計(jì)算的數(shù)超過(guò)了long long怎么解決? —>使用高精度加減乘除,簡(jiǎn)單理解就是 很大的數(shù)進(jìn)行加減乘除。
1. 高精度加法
1. 思路
- 創(chuàng)建對(duì)應(yīng)的數(shù)組變量及其他變量
- 輸入字符串
- 將讀入的數(shù)據(jù)轉(zhuǎn)化為整數(shù)類(lèi)型,并逆序(反轉(zhuǎn))存儲(chǔ)到數(shù)組中
- 將兩個(gè)數(shù)組做累加(注意進(jìn)位)
- 判斷最高位是否為0,大于0代表進(jìn)位了,則讓長(zhǎng)度加1
- 倒序輸出
2. 代碼
#include<bits/stdc++.h>
using namespace std;
int a[510], b[510], c[510];//a:被加數(shù) b:加數(shù) c:和
int main(){
// 1. 輸入字符串
string str1,str2;
cin >> str1 >> str2;
// 2. "1,2,3,4"轉(zhuǎn)換為{1,2,3,4},并且反轉(zhuǎn) {4,3,2,1}
for (int i = 0; i < str1.size(); i ++)
a[str1.size()-1 - i] = str1[i] - '0';
for (int i = 0; i < str2.size(); i ++)
b[str2.size()-1 - i] = str2[i] - '0';
// 3. 找兩個(gè)字符串最大的個(gè)數(shù),目的是為了將每一位計(jì)算完
int ans = max(str1.size(), str2.size());
// 4. 相加(a+b)
for (int i = 0; i < ans; i ++){//遍歷至最大長(zhǎng)度,避免有的數(shù)字沒(méi)計(jì)算
c[i] += a[i] + b[i];//相加
c[i+1] = c[i] / 10;// 進(jìn)位
c[i] %= 10;//將加的結(jié)果求余10 得出第i位
}
//4. 如果結(jié)果數(shù)組第ans位的數(shù)大于0(大于0代表進(jìn)位了),則讓長(zhǎng)度增加1
while(c[ans]>0) ans++;
//5. 倒序輸出
for (int i = ans-1; i >= 0; i--)
cout << c[i];
return 0;
}#include<bits/stdc++.h>
using namespace std;
int a[500],b[500],c[501],ans[501],len_a,len_b,len_ans;//a:加數(shù)1 b:加數(shù)2 c:進(jìn)位數(shù)組 ans:結(jié)果數(shù)組
int main(){
// 1. 輸入字符串
string str1,str2;
cin >> str1 >> str2;
len_a = str1.length();
len_b = str2.length();
// 2. "1,2,3,4"轉(zhuǎn)換為{1,2,3,4},并且反轉(zhuǎn) {4,3,2,1}
for (int i = 0; i < str1.size(); i ++)
a[str1.size()-1 - i] = str1[i] - '0';
for (int i = 0; i < str2.size(); i ++)
b[str2.size()-1 - i] = str2[i] - '0';
// 3. 找兩個(gè)字符串最大的個(gè)數(shù),目的是為了將每一位計(jì)算完
len_ans = max(len_a,len_b);
// 4. 相加(a+b)
for(int i=0;i<=len_ans;i++){
ans[i] = a[i] + b[i] + c[i];//結(jié)果數(shù)組 =(等于) 被加數(shù) 加上 加數(shù) 加上 進(jìn)位的數(shù)
if(ans[i] > 9){//如果結(jié)果數(shù)組大于9,則進(jìn)位
c[i+1] = ans[i] / 10;//給進(jìn)位數(shù)組賦值
ans[i] %= 10; // 讓結(jié)果數(shù)組大于9的數(shù)求余10,變成個(gè)位數(shù)
}
}
//5. 如果結(jié)果數(shù)組len_ans位的數(shù)大于0,則讓長(zhǎng)度增加1
while(ans[len_ans]>0) len_ans++;
//6. 倒敘輸出
for(int i=len_ans-1;i>=0;i--) cout<<ans[i];
return 0;
}2. 高精度減法
1. 思路
- 定義被減數(shù)a,減數(shù)b,結(jié)果c數(shù)組
- 輸入被減數(shù)和減數(shù),并且將數(shù)據(jù)倒敘存入數(shù)組中。
- 找兩個(gè)字符串最大的個(gè)數(shù),目的是為了將每一位計(jì)算完
- 將兩個(gè)數(shù)組做相減(遍歷至最大長(zhǎng)度,避免有的數(shù)字沒(méi)計(jì)算 )。
- 去掉前導(dǎo) 0 。例如結(jié)果為:089,不需要0
- 循環(huán)遍歷輸出
2. 代碼
#include<bits/stdc++.h>
using namespace std;
int a[510], b[510], c[510];//a:被減數(shù) b:減數(shù) c:結(jié)果
int main(){
// 1. 輸入字符串
string str1,str2;
cin >> str1 >> str2;
// 2. "1,2,3,4"轉(zhuǎn)換為{1,2,3,4},并且反轉(zhuǎn) {4,3,2,1}
for (int i = 0; i < str1.size(); i ++)
a[str1.size()-1 - i] = str1[i] - '0';
for (int i = 0; i < str2.size(); i ++)
b[str2.size()-1 - i] = str2[i] - '0';
// 3. 找兩個(gè)字符串最大的個(gè)數(shù),目的是為了將每一位計(jì)算完
int ans = max(str1.size(), str2.size());
// 4. 相減(a-b)
for (int i = 0; i < ans; i ++){//遍歷至最大長(zhǎng)度,避免有的數(shù)字沒(méi)計(jì)算
if(a[i] < b[i]){
a[i+1] -= 1;//向前借一位
a[i] += 10;// 借一位以后加10
}
c[i] = a[i] - b[i];
}
//5. 如去掉前導(dǎo) 0 。例如結(jié)果為:089,不需要0
while(c[ans-1]==0 && ans>1) ans--;
//6. 倒序輸出
for (int i = ans-1; i >= 0; i--)
cout << c[i];
return 0;
}#include<bits/stdc++.h>
using namespace std;
int a[500],b[500],c[501],ans[501],len_a,len_b,len_ans;//a:被減數(shù) b:減數(shù) c:進(jìn)位 ans:結(jié)果
int main(){
// 1. 輸入字符串
string str1,str2;
cin >> str1 >> str2;
len_a = str1.length();
len_b = str2.length();
// 2. "1,2,3,4"轉(zhuǎn)換為{1,2,3,4},并且反轉(zhuǎn) {4,3,2,1}
for (int i = 0; i < str1.size(); i ++)
a[str1.size()-1 - i] = str1[i] - '0';
for (int i = 0; i < str2.size(); i ++)
b[str2.size()-1 - i] = str2[i] - '0';
// 3. 找兩個(gè)字符串最大的個(gè)數(shù),目的是為了將每一位計(jì)算完
len_ans = max(len_a,len_b);
// 4. 相減(a-b)
for(int i=0;i<=len_ans;i++){
ans[i] = a[i] - b[i] - c[i];//結(jié)果數(shù)組 =(等于) 被減數(shù) 減去 減數(shù) 減去 進(jìn)位的數(shù)
if(ans[i] < 0){//如果結(jié)果數(shù)組小于0,則借位
ans[i] += 10;// 借1位,加上10
c[i+1]++; // 進(jìn)位數(shù)組加1
}
}
//5. 如去掉前導(dǎo) 0 。例如結(jié)果為:089,不需要0
while(len_ans>1 && ans[len_ans-1]==0) len_ans--;
//6. 倒序輸出
for(int i=len_ans-1;i>=0;i--) cout<<ans[i];
return 0;
}3. 如果出現(xiàn)被減數(shù)的位數(shù)小于減數(shù)時(shí)呢
#include<bits/stdc++.h>
using namespace std;
int a[510], b[510], c[510];//a:被減數(shù) b:減數(shù) c:結(jié)果
int flag = 0;
int main(){
// 1. 輸入字符串
string str1,str2;
cin >> str1 >> str2;
//2. str1.size() < str2.size() 或者 兩個(gè)數(shù)一樣長(zhǎng)并且被減數(shù)的數(shù)值小于減數(shù)時(shí),才需要交換兩數(shù)位置
if(str1.size() < str2.size() || str1.size() == str2.size() && str1 < str2) {
string t = str1;
str1 = str2;
str2 = t;
flag = 1;
}
// 3. "1,2,3,4"轉(zhuǎn)換為{1,2,3,4},并且反轉(zhuǎn) {4,3,2,1}
for (int i = 0; i < str1.size(); i ++)
a[str1.size()-1 - i] = str1[i] - '0';
for (int i = 0; i < str2.size(); i ++)
b[str2.size()-1 - i] = str2[i] - '0';
// 4. 找兩個(gè)字符串最大的個(gè)數(shù),目的是為了將每一位計(jì)算完
int ans = max(str1.size(), str2.size());
// 5. 相減(a-b)
for (int i = 0; i < ans; i ++){//遍歷至最大長(zhǎng)度,避免有的數(shù)字沒(méi)計(jì)算
if(a[i] < b[i]){
a[i+1] -= 1;//向前借一位
a[i] += 10;// 借一位以后加10
}
c[i] = a[i] - b[i];
}
//6.如去掉前導(dǎo) 0 。例如結(jié)果為:089,不需要0
while(c[ans-1]==0 && ans>1) ans--;
//7. 倒敘輸出
if(flag == 1) cout<<"-";
for (int i = ans-1; i >= 0; i--)
cout << c[i];
return 0;
}到此這篇關(guān)于C++高精度算法的使用場(chǎng)景詳解的文章就介紹到這了,更多相關(guān)C++高精度算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- c++加法高精度算法的簡(jiǎn)單實(shí)現(xiàn)
- 使用C++的string實(shí)現(xiàn)高精度加法運(yùn)算的實(shí)例代碼
- c++實(shí)現(xiàn)高精度加法
- C/C++高精度算法的實(shí)現(xiàn)
- C/C++高精度運(yùn)算(大整數(shù)運(yùn)算)詳細(xì)講解
- C/C++高精度(加減乘除)算法的實(shí)現(xiàn)
- 詳解C/C++高精度算法的簡(jiǎn)單實(shí)現(xiàn)
- C++?高精度乘法運(yùn)算的實(shí)現(xiàn)
- 詳解C/C++高精度(加減乘除)算法中的壓位優(yōu)化
- C/C++高精度算法實(shí)現(xiàn)思路與代碼
相關(guān)文章
2~62位任意進(jìn)制轉(zhuǎn)換方法(c++)
下面小編就為大家?guī)?lái)一篇2~62位任意進(jìn)制轉(zhuǎn)換方法(c++)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)詳解
大家好,本篇文章主要講的是C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01
解決C++ fopen按行讀取文件及所讀取的數(shù)據(jù)問(wèn)題
今天小編就為大家分享一篇解決C++ fopen按行讀取文件及所讀取的數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
C語(yǔ)言實(shí)現(xiàn)停車(chē)場(chǎng)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)停車(chē)場(chǎng)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
QTableWidget設(shè)置只讓某一列可編輯的實(shí)現(xiàn)
本文介紹了如何將QTableWidget的某一列設(shè)置為可編輯,以便用戶(hù)可以輸入自定義數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
一篇文章讓你輕松理解C++中vector和list區(qū)別
對(duì)于學(xué)c語(yǔ)言的同學(xué)來(lái)說(shuō),vector和list這兩個(gè)東西經(jīng)常會(huì)搞錯(cuò),下面這篇文章主要給大家介紹了關(guān)于C++中vector和list區(qū)別的相關(guān)資料,需要的朋友可以參考下2022-01-01
C語(yǔ)言實(shí)現(xiàn)餐飲管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)餐飲管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C語(yǔ)言實(shí)現(xiàn)從文件讀入一個(gè)3*3數(shù)組,并計(jì)算每行的平均值
今天小編就為大家分享一篇C語(yǔ)言實(shí)現(xiàn)從文件讀入一個(gè)3*3數(shù)組,并計(jì)算每行的平均值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12

