洛谷 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]遍历输出即可

 

posted @ 2020-03-10 17:26  雾隐  阅读(250)  评论(0编辑  收藏  举报