我们都知道高精度加法是对于数大于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;
}