大数加法:
先用两个字符串数组存两个大数,但是你输入后字符串数组存的顺序是这样的,比如你输入123与1234,存入数组中是
v[0]=1,v[1]=2,v[2]=3
s[0]=1,s[1]=2,s[2]=3,s[3]=4
但是显然这样的话你没法对应相加,计算加法的话肯定是从个位加起的,理想的应该把大数存成这样的,从个位存起
v[0]=3,v[1]=2,v[2]=1
s[0]=4,s[1]=3,s[2]=2,s[3]=1
这样的话个位、十位、百位…就能对应相加了,那要怎样才能从个位存起呢,只需再定义两个int数组x,y分别存放v,s中的大数,将v中的最后一位即个位存到x的第一位(x[0]),用for循环即可实现,然后数组x和y就存放了了两个大数。
然后再定义一个数组z存放两个大数的和,这时候就又涉及进位的问题了,比如求 28+13 ,x[0]=8,y[0]=3,显然个位相加之后个位变成了z[0]=(8+3)%10=1,同时十位进了1,此时z[1]=1,然后算十位的时候 z[1]+=v[1]+s[1],应该加上上一步个位相加进上去的1,算出z[1]=1+1+2=4, 最后输出结果的时候应该倒着输出因为z[0]存放的是个位。而输出的时候肯定先将最大位输出,最后输出个位。然后你还需要考虑位数的情况,两位数相加可能就变成了3位数,所以你要多考虑一位,比如两个2位数的数相加你要考虑第三位,如果一个3位数的数与一个1位数的数相加你要考虑第四位,说白了就是需要考虑最大数的位数加1的位数(最大数为一个3位数的数你要考虑第四位,最大数为10位的数你要考虑第11位)
然后根据题目的要求,可能要考虑输出有前导0的情况和不输出前导0的情况,然后我写了两个模板,输出考虑前导0(01+01输出是02,01+13输出是14),不考虑的话是(01+01输出为 2)下面我写了两个模板;
输出前导0
#include <iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
using namespace std;
char v[100005],s[100005];
int x[100005],y[100005],z[100005];
int main()
{
while(scanf("%s",v)!=EOF)
{
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
memset(z,0,sizeof(z