电子学会 C语言 2级 55 、大整数加法 (2020 真题)

1168:大整数加法

信息学奥赛一本通(C++版)在线评测系统

P1601 A+B Problem(高精)

A+B Problem(高精) - 洛谷

1.6编程基础之一维数组 10:大整数加法

OpenJudge - 10:大整数加法




C++参考代码一:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <bits/stdc++.h> 
using namespace std;
int main( void )
{
	//char a1[300],b1[300];
	
	string a1,b1;
	
	int a[300],b[300],c[300],lena,lenb,lenc,i,x;
	
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	
	//输入加数与被加数
	//gets(a1);
	//gets(b1);
	
	cin>>a1;
	cin>>b1;
	                                         
	lena=a1.length();
	lenb=b1.length();
	
	//将输入字符串倒置
	//加数放入a数组 
	for (i=0;i<=lena-1;i++) a[lena-i]=a1[i]-48;    
	/*
	//加数放入a数组
	for (i=0;i<=lena-1;i++) a[lena-i]=a1[i]-'0';    
	*/
	
	//加数放入b数组
	for (i=0;i<=lenb-1;i++) b[lenb-i]=b1[i]-48;    
	
	lenc =1;
	x=0;
	while ( lenc <=lena || lenc <=lenb )
	{
		//两数相加
		c[lenc]=a[lenc]+b[lenc]+x;     
		x=c[lenc]/10;
		c[lenc]%=10;
	    lenc++;
	}
	c[lenc]=x; 
	
	//去掉多余的0
	while(c[lenc]==0 && lenc>1)   
	{
		lenc--;
	}
	/*
	//处理最高进位
	if (c[lenc]==0)
		lenc--;                                    
	*/
	
	//输出结果
	for (i=lenc;i>=1;i--) 
		cout<<c[i];                            
	
	cout<<endl;
	
	return 0;
} 


C++参考代码二:

//program p5_1
/*
第1课 加法天才(add)-有前导0 

指针常量和常量指针的区别
https://www.cnblogs.com/hsy1941/p/10506758.html
*/
#include <bits/stdc++.h>
using namespace std;
int lena,lenb,lenc;
const int maxL=200;
int a[maxL],b[maxL],c[maxL];
void add(int a[],int lena,int b[],int lenb,int c[],int &lenc) //形参 定义 
{
	memset(c,0,sizeof(c)); //快 
	
	lenc=max(lena,lenb);
	
	for(int i=0;i<lenc;++i)
	{
		c[i]+=a[i]+b[i];
		if(c[i]>=10)
		{
			//向前进1位 
			++c[i+1];
			
			//当前的位置要减去进位的10 
			c[i]-=10;
		}
	}
	 
	//最高位向前进1位 
	if( c[lenc] ) 
	{
		//运算结果的长度增1 
		++lenc;
	}	
	
	//去掉多余的前导0 如果只有一个0,则无需去掉 
	while(c[lenc-1]==0 && lenc>1)   
	{
		lenc--;
	}
}
int main( void )
{
	/*
	856
	255
	*/
	string s;
	
	cin>>s;
	lena=s.length();
	
	//倒着存 
	for(int i=0;i<lena;i++)
	{
		a[i]=s[lena-1-i]-'0';
		//658 
	}
	
	//输入第2个数 
	cin>>s;
	lenb=s.length();
	
	//倒着存
	for(int i=0;i<lenb;i++)
	{
		//s[lenb-1-i]-'0' 将字符串转为数字 
		b[i]=s[lenb-1-i]-'0';
	}
	//552
	
	//高精函数 
	add(a,lena,b,lenb,c,lenc);//实参 
	
	//输出的时候倒着输出 
	for(int i=lenc-1;i>=0;--i)
	{
		cout<<c[i];
	}
	cout<<endl;
	
	return 0;
}
/* 
【输入样例】
8569742356145896
215783669444444427

【输出样例】
224353411800590323
*/



 



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

dllglvzhenfeng

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

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

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

打赏作者

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

抵扣说明:

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

余额充值