C/C++ 大数加法的讲解及模板(考虑前导0和不考虑前导0)

大数加法:

先用两个字符串数组存两个大数,但是你输入后字符串数组存的顺序是这样的,比如你输入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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值