• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
咸鱼爱学习
博客园    首页    新随笔    联系   管理    订阅  订阅
【高精度】大整数加法

题目相关

【题目描述】

求两个不超过200位的非负整数的和。

【输入】

有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

【输出】

一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

【输入样例】

22222222222222222222
33333333333333333333

【输出样例】

55555555555555555555

分析

本题考察的是高精度计算中的加法计算。

对于超出数据类型范围的数据,我们首先需要解决的就是输入、存储的问题。int与long long类型是存储不来200位这么庞大的数据的。我们采用字符串的方式来解决输入、存储的问题。

之后再来考虑如何进行数据的计算。这个过程我们则采用模拟竖式计算的过程来进行处理。将他们个位对个位,十位对十位,再从个位开始依次相加,过程中逢十进一。

那么在过程中需要注意相加的时候是低位对齐的,我们可以使字符串倒序以便容易实现低位对齐的效果。计算时也是整数和整数进行计算,我们可以再将其转换成整数类型。字符数字转整数数字的话,减去字符零即可。

最后输出答案时,在将其倒转过来即可正常输出答案。

代码实现

#include <iostream>
#include <cstring>
using namespace std;
/*
1. 输入、存储 大整数  

2. 计算 模拟竖式计算
低位对齐  倒序处理  转换 
*/
int main(){
	char s1[205]={0},s2[205]={0};
	int n1[205]={0},n2[205]={0}; 
	cin>>s1>>s2;
	 
	//倒序 
	int l1=strlen(s1);
	int l2=strlen(s2);
	
	for(int i=0;i<l1;i++){
		n1[i]=s1[l1-i-1]-'0';
	}
	for(int i=0;i<l2;i++){
		n2[i]=s2[l2-i-1]-'0';
	}
	//计算
	int len=max(l1,l2);
	for(int i=0;i<len;i++){
		
		n1[i]=n1[i]+n2[i];
		n1[i+1]=n1[i+1]+n1[i]/10;//处理进位的值 
		n1[i]=n1[i]%10;
	}
	//倒序输出
	int flag=0;
	for(int i=len;i>=0;i--){
		if(n1[i]!=0||i==0) flag=1;
		if(flag==1)
			cout<<n1[i];
	}
	return 0;
}

视频链接

链接

源码

源码上传至Gitee仓库中,欢迎star!
Fork me on Gitee
Fork me on Gitee

不积硅步,无以至千里。
posted on 2020-12-16 22:26  咸鱼爱学习  阅读(292)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3