swust oj题解#15 A+B Plus(高精通加法)

目录

题目

思路解析

代码实现


题目

输入两个数a,b,计算a+b(定义范围超过long long)

思路解析

这个题,本质还是加法,我们小学就都知道,加法就是做竖式运算。

例如:        
        19827
     +    333
————————————————
     =  20160

定义范围超过long long。那就只能用字符串来输入了。

由于字符相加,比如'4'+'9'结果并非13,而是字符'm'(ASCII表)

因此,我们需要把字符转换为数字,并且存在数组中

scanf("%s %s",a1,a2);
//统计长度
//定义len3为两串数字的长度之差,max为最大长度。
int len1=strlen(a1),len2=strlen(a2),len3,max;
if(len1>len2)
{
	len3=len1-len2;
	max=len1;
}
else
{
	len3=len2-len1;
	max=len2;
}
//将字符串转换为数字并存入数组中。
//数字字符减去'0',即转化为对应的数字。
if(len1>len2)
{
	for(int i=1;i<=max;i++) b1[i]=a1[i-1]-'0';
        for(int i=1+len3;i<=max;i++) b2[i]=a2[i-len3-1]-'0';
}
else
{
	for(int i=1+len3;i<=max;i++) b1[i]=a1[i-len3-1]-'0';
	for(int i=1;i<=max;i++) b2[i]=a2[i-1]-'0';
}

由于原理是《竖式运算》,因此存入数组中必须为从i=1开始(为了进满十进位)。

并且,短的数串,从中间开始赋值,这样才能对齐并相加。

还是刚才的例子:19827+333,以及67+45=112。

对齐之后
实际效果为:        
         019827        067
     +   000333     +  045
———————————————    ———————
     =   020160     =  112

看到这里,肯定有小伙伴会问:为什么这么麻烦,不直接输入在数组中呢?因为输入一个数,

它不一定是1位数,可以是多位数。举个例子:输入用数组定义的8888,

电脑是无法识别a[0]是8还是88还是888......。而字符就不一样,字符则是单个数了

用字符输入1234,则a[0]为1,a[1]为2,a[2]为3,a[3]为4。

基本结构搭建完了,接下来就是相加了。

然后,这道题的难点其实也就在于满十进位,如9+4=13,甚至于连续的进位,如999+2=1001。

//从个位数开始,因此要倒着相加。
for(int i=max;i>0;i--)
{
	//相加,这里一定要+=
        //如果是=,那么之前的进位就白费了。
	plus[i]+=b1[i]+b2[i];
	//大于10,进行进位。 
	if(plus[i]>=10)
        {
		plus[i]-=10;
		plus[i-1]++;
	}
}

相加做完了,接下来就是输出了

if的判断机制是if(true)则执行,if(false)则不执行,而电脑会默认false为0,因此当plus[0]==0时候

if(plus[0])也就是if(false),也就不会执行了。

if(plus[0]) for(int i=0;i<=max;i++) printf("%d",plus[i]);
else        for(int i=1;i<=max;i++) printf("%d",plus[i]);
printf("\n");

代码实现

#include <bits/stdc++.h> 
char a1[100005],a2[100005];
int  b1[100005]={0},b2[100005]={0};
int plus[100005]={0};
int main()
{
	scanf("%s %s",a1,a2);
	int len1=strlen(a1),len2=strlen(a2),len3,max;
	if(len1>len2)
	{
		len3=len1-len2;
		max=len1;
	}
	else
	{
		len3=len2-len1;
		max=len2;
	}
	if(len1>len2)
	{
		for(int i=1;i<=max;i++) b1[i]=a1[i-1]-'0';
	    for(int i=1+len3;i<=max;i++) b2[i]=a2[i-len3-1]-'0';
	}
	else
	{
		for(int i=1+len3;i<=max;i++) b1[i]=a1[i-len3-1]-'0';
	    for(int i=1;i<=max;i++) b2[i]=a2[i-1]-'0';
	}
	for(int i=max;i>0;i--)
	{
		plus[i]+=b1[i]+b2[i];
		if(plus[i]>=10)
		{
			plus[i]-=10;
			plus[i-1]++;
		}
	}
	if(plus[0]) for(int i=0;i<=max;i++) printf("%d",plus[i]);
	else        for(int i=1;i<=max;i++) printf("%d",plus[i]);
	printf("\n");
	return 0;
}

几个月之后的更新版本 

string HighProAdd(string num1,string num2) {
    if(num1.size()<num2.size()) swap(num1,num2);
    int a[100000],b[100000];
    for(int i=1;i<=num1.size();i++) a[i]=num1[num1.size()-i]-'0';
    for(int i=1;i<=num2.size();i++) b[i]=num2[num2.size()-i]-'0';
    for(int i=1;i<=num1.size();i++) {
        a[i]+=b[i];
        if(a[i]>9) {
            a[i+1]+=a[i]/10;
            a[i]%=10;
        }
    }
    string add="";
    if(a[num1.size()+1]==0) for(int i=num1.size();i>=1;i--) add+=a[i]+'0';
    if(a[num1.size()+1]==1) for(int i=num1.size()+1;i>=1;i--) add+=a[i]+'0';
    return add;
}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是孤衾呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值