洛谷 P1601 A+B Problem(高精)
题目背景
无
题目描述
高精度加法,相当于a+b problem,不用考虑负数.
输入格式
分两行输入。a,b<=10^{500}a,b<=10500
输出格式
输出只有一行,代表a+ba+b的值
代码
1 #include<iostream> 2 #include<cstdio> 3 #include<math.h> 4 #include<algorithm> 5 #include<cstring> 6 using namespace std; 7 8 struct gaojing 9 { 10 int n; 11 unsigned int z[600]={0}; 12 char s[600]; 13 14 gaojing() 15 { 16 n=1; 17 memset(s,0,sizeof(s)); 18 } 19 20 void init() 21 { 22 scanf("%s",s); 23 24 n=strlen(s); 25 26 reverse(s,s+n); 27 28 for(int i=0;i<n;i++) 29 { 30 z[i]=s[i]-'0'; 31 } 32 } 33 }; 34 35 36 gaojing c; 37 38 gaojing operator+(const gaojing &a,const gaojing &b) 39 { 40 c.n=max(a.n,b.n); 41 42 for(int i=0;i<c.n;i++) 43 { 44 c.z[i]=a.z[i]+b.z[i]; 45 } 46 47 for(int i=0;i<c.n;i++) 48 { 49 c.z[i+1]+=c.z[i]/10; 50 c.z[i]=c.z[i]%10; 51 } 52 53 if(c.z[c.n]!=0) c.n++; 54 } 55 56 int main(void) 57 { 58 gaojing a,b; 59 a.init(); 60 b.init(); 61 a+b; 62 // printf("%d %d %d\n",a.n,b.n,c.n); 63 if(c.z[c.n+1]!=0) c.n++; 64 for(int i=c.n-1;i>=0;i--) 65 { 66 printf("%d",c.z[i]); 67 } 68 69 return 0; 70 }
这道题用的是另一种方法——结构体+重载运算符
1.reserve函数:将元素变为倒序,相当于从字符串的len-1遍历到0,但后面仍需要再将它转换为int型
2.重载运算符:将“+”定义新的运算方式,但只有在满足是gaojing与gaojing数据类型的相加才能使用这个重载后的“+”进行运算
3.相加的运算次数需要根据a和b中最长数据来决定
4.重载运算符的运算中,最后的进位需要进行特判,应该是c.z[c.n],而不是c.z[c.n+1],因为数据是从0到n-1的,直接判断从c.z[c.n]即可
5.gaojing数据类型输入:使用在该结构体中的init函数进行输入
6.输出直接使用c.z[i]遍历输出即可