網(wǎng)站首頁 編程語言 正文
描述
如果要計算的數(shù)超過了long long怎么解決? —>使用高精度加減乘除,簡單理解就是 很大的數(shù)進行加減乘除。
1. 高精度加法
1. 思路
- 創(chuàng)建對應的數(shù)組變量及其他變量
- 輸入字符串
- 將讀入的數(shù)據(jù)轉化為整數(shù)類型,并逆序(反轉)存儲到數(shù)組中
- 將兩個數(shù)組做累加(注意進位)
- 判斷最高位是否為0,大于0代表進位了,則讓長度加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"轉換為{1,2,3,4},并且反轉 {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. 找兩個字符串最大的個數(shù),目的是為了將每一位計算完
int ans = max(str1.size(), str2.size());
// 4. 相加(a+b)
for (int i = 0; i < ans; i ++){//遍歷至最大長度,避免有的數(shù)字沒計算
c[i] += a[i] + b[i];//相加
c[i+1] = c[i] / 10;// 進位
c[i] %= 10;//將加的結果求余10 得出第i位
}
//4. 如果結果數(shù)組第ans位的數(shù)大于0(大于0代表進位了),則讓長度增加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:進位數(shù)組 ans:結果數(shù)組
int main(){
// 1. 輸入字符串
string str1,str2;
cin >> str1 >> str2;
len_a = str1.length();
len_b = str2.length();
// 2. "1,2,3,4"轉換為{1,2,3,4},并且反轉 {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. 找兩個字符串最大的個數(shù),目的是為了將每一位計算完
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];//結果數(shù)組 =(等于) 被加數(shù) 加上 加數(shù) 加上 進位的數(shù)
if(ans[i] > 9){//如果結果數(shù)組大于9,則進位
c[i+1] = ans[i] / 10;//給進位數(shù)組賦值
ans[i] %= 10; // 讓結果數(shù)組大于9的數(shù)求余10,變成個位數(shù)
}
}
//5. 如果結果數(shù)組len_ans位的數(shù)大于0,則讓長度增加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,結果c數(shù)組
- 輸入被減數(shù)和減數(shù),并且將數(shù)據(jù)倒敘存入數(shù)組中。
- 找兩個字符串最大的個數(shù),目的是為了將每一位計算完
- 將兩個數(shù)組做相減(遍歷至最大長度,避免有的數(shù)字沒計算 )。
- 去掉前導 0 。例如結果為:089,不需要0
- 循環(huán)遍歷輸出
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"轉換為{1,2,3,4},并且反轉 {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. 找兩個字符串最大的個數(shù),目的是為了將每一位計算完
int ans = max(str1.size(), str2.size());
// 4. 相減(a-b)
for (int i = 0; i < ans; i ++){//遍歷至最大長度,避免有的數(shù)字沒計算
if(a[i] < b[i]){
a[i+1] -= 1;//向前借一位
a[i] += 10;// 借一位以后加10
}
c[i] = a[i] - b[i];
}
//5. 如去掉前導 0 。例如結果為: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:進位 ans:結果
int main(){
// 1. 輸入字符串
string str1,str2;
cin >> str1 >> str2;
len_a = str1.length();
len_b = str2.length();
// 2. "1,2,3,4"轉換為{1,2,3,4},并且反轉 {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. 找兩個字符串最大的個數(shù),目的是為了將每一位計算完
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];//結果數(shù)組 =(等于) 被減數(shù) 減去 減數(shù) 減去 進位的數(shù)
if(ans[i] < 0){//如果結果數(shù)組小于0,則借位
ans[i] += 10;// 借1位,加上10
c[i+1]++; // 進位數(shù)組加1
}
}
//5. 如去掉前導 0 。例如結果為: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ù)時呢
#include<bits/stdc++.h>
using namespace std;
int a[510], b[510], c[510];//a:被減數(shù) b:減數(shù) c:結果
int flag = 0;
int main(){
// 1. 輸入字符串
string str1,str2;
cin >> str1 >> str2;
//2. str1.size() < str2.size() 或者 兩個數(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"轉換為{1,2,3,4},并且反轉 {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. 找兩個字符串最大的個數(shù),目的是為了將每一位計算完
int ans = max(str1.size(), str2.size());
// 5. 相減(a-b)
for (int i = 0; i < ans; i ++){//遍歷至最大長度,避免有的數(shù)字沒計算
if(a[i] < b[i]){
a[i+1] -= 1;//向前借一位
a[i] += 10;// 借一位以后加10
}
c[i] = a[i] - b[i];
}
//6.如去掉前導 0 。例如結果為: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;
}
原文鏈接:https://blog.csdn.net/m0_56945138/article/details/126754569
相關推薦
- 2022-12-13 深入了解Go的HttpClient超時機制_Golang
- 2022-09-19 教你使用Python從文件中提取IP地址_python
- 2021-12-02 docker容器時區(qū)錯誤問題_docker
- 2022-04-11 Android開發(fā)中checkBox自定義樣式
- 2022-11-01 使用Python處理KNN分類算法的實現(xiàn)代碼_python
- 2021-12-14 nginx.pid打開失敗以及失效的解決方案_nginx
- 2022-12-21 Swift使用enum抹平數(shù)組元素差異實例詳解_Swift
- 2023-07-06 springboot監(jiān)聽Redis 緩存過期(Key 失效)事件
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支