高精度加法(解析+延伸)

我们都知道高精度加法是对于数大于long long型加法不够用时用高精度进行计算的算法,
这种算法是采用小学时竖式那种型式计算的,步骤也很简单,先倒序存入俩string型字
符串,然后一位一位计算,同时注意进位,删去前导零,最后再倒序输出(因为之前
是倒序存入,,答案是反的,所以最后就得倒序输出)

我们常见得代码都是数组搞定的
如下------------

#include<bits/stdc++.h> 
using namespace std;
const int qq=200005;//定义。      const是让这个变量不会变
char s1[qq],s2[qq];           //string也可以。但会麻烦些
int a[qq],b[qq],c[qq];
int main(){
cin>>s1>>s2;
int len1,len2,len3;
len1=strlen(s1);
len2=strlen(s2);
for(int i=0;i<len1;i++)//倒序存入
	a[i]=s1[len1-i-1]-'0';  //char便变int
for(int j=0;j<len2;j++)
    b[j]=s2[len2-j-1]-'0';
len3=max(len1,len2)+1;//也可以是len1<len2?len1:len2,都是返回最大的
int x=0;
for(int i=0;i<len3;i++){//计算
	c[i]=a[i]+b[i]+x;//x是看进位多少,一齐加上去
	x=c[i]/10;//进位
	c[i]=c[i]%10;//变一位
}
if(x!=0)//防最后进位
len3++,c[len3-1]=x;
for (int i=len3-1;i>=0;i--) {//删前导零
    if (0==c[i]&&len3>1) {//len3-1是为了防止是00 全去了,得留一位。
        len3--;//删前导零很简单,直接减去那段
    }else {
        break;//没有前导零了直接跳出
    }
}
for(int i=0;i<len3;i++){//最后倒序输出
	cout<<c[len3-i-1];
}
return 0;
}

可以看见高精度加法非常简单,也非常实用。
顺便给个题目答案。

链接: 1168:大整数加法

1168:大整数加法

【题目描述】
求两个不超过200位的非负整数的和。

【输入】
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

【输出】
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

【输入样例】
22222222222222222222
33333333333333333333
【输出样例】
55555555555555555555

#include<bits/stdc++.h> 
using namespace std;
const int qq=215;
char s1[qq],s2[qq];
int a[qq],b[qq],c[qq];
int main(){
cin>>s1>>s2;
int len1,len2,len3;
len1=strlen(s1);
len2=strlen(s2);
for(int i=0;i<len1;i++)
	a[i]=s1[len1-i-1]-'0';
for(int j=0;j<len2;j++)
    b[j]=s2[len2-j-1]-'0';
len3=max(len1,len2)+1;
int x=0;
for(int i=0;i<len3;i++){
	c[i]=a[i]+b[i]+x;
	x=c[i]/10;
	c[i]=c[i]%10;
}
if(x!=0)
len3++,c[len3-1]=x;
for (int i=len3-1;i>=0;i--) {
    if (0==c[i]&&len3>1) {
        len3--;
    }else {
        break;
    }
}
for(int i=0;i<len3;i++){
	cout<<c[len3-i-1];
}
return 0;
}

你以为这就完了?
错!

都知道了高精度加法数组的解释,
那有没有别的呢?
当然有
结构体struct了解下

#include<bits/stdc++.h> 
#define base 10
using namespace std;
char str[20005];
struct node{//数组存储
	int len,s[20005];
	node(){len=0;memset(s,0,sizeof(s));}//构造结构体函数
};
node operator+(const node&a,const node&b){//重载运算符函数-----就是计算加去前导零
	node c;
	c.len=max(a.len,b.len);
	for(int i=1;i<=c.len;i++){
		c.s[i]+=a.s[i]+b.s[i];
		c.s[i+1]+=c.s[i]/base;
		c.s[i]%=base;
	}
	if(c.s[c.len+1]) c.len++;
for (int i=c.len;i>=0;i--) {
    if (0==c.s[i]&&c.len>1) {
        c.len--;
    }else {
        break;
    }
}
	return c;
}
node read(){//数组读入函数
	cin>>str;
	int len=strlen(str);
	node a;a.len=len;
	for(int i=0;i<len;i++)
		a.s[len-i]=str[i]-'0';
		return a;
}
void print(node a){//倒序输出函数
	for(int i=a.len;i>=1;i--)
	cout<<a.s[i];
}
int main(){
node a,b,c;
a=read(),b=read();//把读入的给a,b
c=a+b;//别问为什么,看重载运算符函数再看看这行代码自然就懂了
print(c);
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值