杭电1002题,大数加法典型问题,这道题怎么说呢,说难不难,但要注意一些细节。
先说一下解大数加法解题的思路,给你两个超长的数,首先,你可以用两个字符串a,b来保存,计算字符串的长度,然后将字符串中的每个字符转化为数字逆序保存到int型数组c,d中,然后两数组相加保存到一个新数组e中即可,进位的话就e[i+1]++即可。
举个例子:
比如算789 + 456.首先用两个字符串a,b分别保存好。然后计算他们的长度len1,len2,接着建立两个int型数组c,d长度分别为len1,len2即可。因为加法要从个位开始,为了方便计算我们需要将每个字符逆序保存到c,d中,即c[0]=9,c[1]=8,c[2]=7, d[0]=6,d[1]=5,d[2]=4. 然后将两数组相加保存到一个新数组e中,
e数组要先初始化为0(这点很重要!!!!).
e数组长度可以设置为len( len=max(len1,len2)+1 ),len=4, 这样我们就可以开始加了,e[0]=c[0]+d[0]=15大于10了,我们让e[0]对10取模即可,即e[0]%=10,这样e[0]=5, 有进位,因为e数组已经初始化为0,那么e[0+1]++即可,即e[1]变成1了,如果是第i个数,e[i+1]++即可。e[1]=(e[1]+c[1]+d[1])%10即 e[1]=(1+8+5)%10=4, 依此类推e[2]=2, e[3]=1,逆序输出e数组即得到我们的结果1245.
博主刚开始只把核心算法写了,然后一提交就error,我心想,我核心算法应该对啊,怎么老error呢,error几次以后发现是没有把字符串逆序保存到c,d数组中导致的。本以为到这就完事了,改完程序后一提交,神马!?presentation error,好吧,我要哭了有木有, 难受wuwuwu......
又仔细看了一下输出格式要求,发现我多输出了一个回车,改完后终于ac。瞬间很兴奋有木有~~~~~~~
嗯,就写到这吧,最后代码如下:
觉得有用记得顶一下哦~~~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68#include <iostream> #include <string.h> #define N 1010 using namespace std; void print(int a[], int len) { //判断a[len]是否为0,为0表示两数相加不进位,不为0则表示进位了 if(a[len]) { for(int i=len; i>=0; i--)//不进位 cout<<a[i]; } else { for(int i=len-1; i>=0; i--)//进位 cout<<a[i]; } cout<<endl; } int main() { int T=0; cin>>T; int countt=0;//计数器,每输出一次加1 while(T--) { string a,b; int c[N],d[N],e[N]; memset(c,0,sizeof(c)); memset(d,0,sizeof(d)); memset(e,0,sizeof(e));//此处e数组必须初始化为0 cin>>a>>b; int len1=a.length(),len2=b.length(); int len=max(len1,len2);//用len保存len1 len2中较长的那个 for(int i=len1-1,j=0; i>=0; i--,j++)//将字符串a转化为数字并逆序保存到c数组中 { c[j]=a[i]-'0'; } for(int i=len2-1,j=0; i>=0; i--,j++)//将字符串b转化为数字并逆序保存到d数组中 { d[j]=b[i]-'0'; } for(int i=0; i<len+1; i++) //c,d两数组相加保存到e中,e的长度应该是小于等于a,b字符串中较长的那个+1的,即len+1 { e[i]=e[i]+c[i]+d[i];//e数组初始化为0方便此处相加哦QAQ,我就是在这错了,刚开始没加e[i] if(e[i]>9) { e[i]%=10; e[i+1]++; } } //输出格式问题,该加的空格要加上不该加的回车不要加,否则会出现presentation错误 cout<<"Case "<<++countt<<":"<<endl; cout<<a<<" + "<<b<<" = "; print(e,len);//逆序输出e数组 if(T>0)//判断是否需要多加空行 cout<<endl; } return 0; }
最后
以上就是高高水壶最近收集整理的关于杭电1002题,大数加法问题C++版的全部内容,更多相关杭电1002题内容请搜索靠谱客的其他文章。
发表评论 取消回复