- gf25012 的博客
《碧玉澜诗·C++》其二--2025.08.05:高精度加法减法
- @ 2025-8-5 19:18:18
一.高精度加法
①输入两个加数(字符串as,bs)
cin>>as>>bs;
②倒序存进数组a[10005]和b[10005]里面(目的是为了让两个加数的末位对齐)
int ka=as.size(),kb=bs.size(),kc=max(ka,kb);
for(int i=0;i<ka;i++){
a[ka-i-1]=as[i]-'0';
}
for(int i=0;i<kb;i++){
b[kb-i-1]=bs[i]-'0';
}
③将数组a和数组b一位一位相加
for(int i=0;i<kc;i++){
c[i]=a[i]+b[i];
}
④处理进位的问题
for(int i=0;i<kc;i++){
if(c[i]>9){
c[i+1]=c[i+1]+c[i]/10;//因为是倒序存储,所以是i+1;
c[i]=c[i]%10;
}
}
⑤需要特判最高位(只需要判断一位即可)
if(c[kc]!=0){
kc++;
}
⑥输出
for(int i=kc-1;i>=0;i--){
cout<<c[i];
}
*完整代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
string as,bs;
int a[10005]={0},b[10005]={0},c[10005]={0};
cin>>as>>bs;
int ka=as.size(),kb=bs.size(),kc=max(ka,kb);
for(int i=0;i<ka;i++){
a[ka-i-1]=as[i]-'0';
}
for(int i=0;i<kb;i++){
b[kb-i-1]=bs[i]-'0';
}
for(int i=0;i<kc;i++){
c[i]=a[i]+b[i];
}
for(int i=0;i<kc;i++){
if(c[i]>9){
c[i+1]=c[i+1]+c[i]/10;
c[i]=c[i]%10;
}
}
if(c[kc]!=0){
kc++;
}
for(int i=kc-1;i>=0;i--){
cout<<c[i];
}
return 0;
}
二.高精度减法
①输入两个加数(字符串sa,sb)
cin>>sa>>sb;
②确保被减数(a)大于减数(b)
int ka=sa.size(),kb=sb.size(),kc;
if(ka<kb||(ka==kb&&sa<sb)){
flag=1;
swap(ka,kb);
swap(sa,sb);
}
③倒序存进数组a[10005]和b[10005]里面(目的是为了让减数和被减数的末位对齐)
for(int i=0;i<ka;i++){
a[ka-i-1]=sa[i]-'0';
}
for(int i=0;i<kb;i++){
b[kb-i-1]=sb[i]-'0';
}
④将数组a和数组b一位一位相减
for(int i=0;i<ka;i++){
c[i]=a[i]-b[i];
}
⑤处理借位的问题
for(int i=0;i<ka;i++){
if(c[i]<0){
c[i+1]--;
c[i]=c[i]+10;
}
}
⑥删除前导0并判断结果是否为负数
kc=ka;
while(kc>0&&c[kc]==0){
kc--;
}
if(flag==1){
cout<<'-';
}
⑦输出
for(int i=kc-1;i>=0;i--){
cout<<c[i];
}
*完整代码:
#include<bits/stdc++.h>
using namespace std;
string sa,sb;
int flag=0;
int a[10005],b[10005],c[10005];
int main()
{
cin>>sa>>sb;
int ka=sa.size(),kb=sb.size(),kc;
if(ka<kb||(ka==kb&&sa<sb))
{
flag=1;
swap(ka,kb);
swap(sa,sb);
}
for(int i=0;i<ka;i++)
{
a[i]=sa[ka-i-1]-'0';
}
for(int i=0;i<kb;i++)
{
b[i]=sb[kb-i-1]-'0';
}
for(int i=0;i<ka;i++)
{
c[i]=a[i]-b[i];
}
for(int i=0;i<ka;i++)
{
if(c[i]<0)
{
c[i+1]--;
c[i]=c[i]+10;
}
}
kc=ka;
while(kc>0&&c[kc]==0)
{
kc--;
}
if(flag==1)
{
cout<<'-';
}
for(int i=kc;i>=0;i--)
{
cout<<c[i];
}
return 0;
}