大数加减法(洛谷的P1601、P2142)

大整数加减法 普通的计算器在进行大整数的加减法时,可能会因为越界而丢掉后面的数。而该算法可实现两个大整数的加减法运算,能解决以上出现的问题。 立即下载

大数加法:
原题连接
对于一些范围比较小的数据,利用C/C++自带的数据类型就可以解决。但是对于一些数据比如10^1000000这样的数据,我们如何处理呢?
这时,我们就要用到大数运算了。
大数运算的根本在于要用字符串或是数组对每一位进行保存。下面介绍一下大数加法。由于大数加法比较简单,我们直接对字符串进行操作,不在用数组了。
第一步是以字符串的形式输入两个整数

 string a, b;
    cin >> a >> b;
    string resa = a;
    string resb = b;
    for (int i = 0; i < a.size(); i++)
        resa[i] = a[a.size() - 1 - i];
    for (int i = 0; i < b.size(); i++)
        resb[i] = b[b.size() - 1 - i];
    int maxSize = a.size() > b.size() ? a.size() : b.size();

resa,resb是a,b的反转字符串。为什么反转?我们模拟一下我们做加法,是列一个竖式从个位加到最高位。所以我们反转一下字符串便于运算。

  string ans;
    int i = 0, j = 0;
    bool flag = 0;
    while (resa[i] != '\0'|| resb[j] != '\0') {
        if (resa[i] != '\0' && resb[j] != '\0') {
            int x = resa[i] + resb[j] - '0' - '0' + flag;
            if (x >= 10) {
                ans.push_back(x % 10 + '0');
                flag = 1;
            }
            else {
                ans.push_back(x + '0');
                flag = 0;
            }
            i++;
            j++;
        }

这里有几个变量ans是答案,flag是进位(因为进位不可能为2,所以我们直接用bool变量),因为可能存在要进位的情况。接下来进入循环。循环的终止条件是什么呢?就是两个字符串都加到最高位了,也就是此时为’\0’状态。那么我们考虑一下可能存在的情况。第一种情况:两个字符串都没有到达最高位。int x = resa[i] + resb[j] - ‘0’ - ‘0’ + flag这条语句就是就是计算此时该位相加的结果,注意要减去’0’,而且要加上进位的结果。如果x>=10说明要进位了,我们在ans后添加x的各位数字(要加上’0’),并把flag赋值为1,代表要进位;否则就直接把x添加上去,flag赋值为。然后i++,j++,移动至下一个字符。

else if (resa[i] != '\0' && resb[j] == '\0') {
            int x = resa[i] - '0'+ flag;
            if (x >= 10) {
                ans.push_back(x % 10 + '0');
                flag = 1;
            }
            else {
                ans.push_back(x + '0');
                flag = 0;
            }
            i++;
        }
        else {
            int x = resb[j] - '0' + flag;
            if (x >= 10) {
                ans.push_back(x % 10 + '0');
                flag = 1;
            }
            else {
                ans.push_back(x + '0');
                flag = 0;
            }
            j++;
        }

我们想,加法会有两个数位数不一致的情况。那么还需要处理一下这种情况。但其实实质与两位相加相同。这可以理解为其中一位为零。

 if (flag)
        ans.push_back('1');
    for (int i = ans.size() - 1; i >= 0; i--)
        cout << ans[i];

当然还有一种情况,举个栗子,50+50,最后肯定要再添一位。但是在循环中有进位有延后。所以我们还要再判断一下是否要进位。最后逆序输出。
完整代码:

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string a, b;
    cin >> a >> b;
    string resa = a;
    string resb = b;
    for (int i = 0; i < a.size(); i++)
        resa[i] = a[a.size() - 1 - i];
    for (int i = 0; i < b.size(); i++)
        resb[i] = b[b.size() - 1 - i];
    int maxSize = a.size() > b.size() ? a.size() : b.size();
    string ans;
    int i = 0, j = 0;
    bool flag = 0;
    while (resa[i] != '\0'|| resb[j] != '\0') {
        if (resa[i] != '\0' && resb[j] != '\0') {
            int x = resa[i] + resb[j] - '0' - '0' + flag;
            if (x >= 10) {
                ans.push_back(x % 10 + '0');
                flag = 1;
            }
            else {
                ans.push_back(x + '0');
                flag = 0;
            }
            i++;
            j++;
        }
        else if (resa[i] != '\0' && resb[j] == '\0') {
            int x = resa[i] - '0'+ flag;
            if (x >= 10) {
                ans.push_back(x % 10 + '0');
                flag = 1;
            }
            else {
                ans.push_back(x + '0');
                flag = 0;
            }
            i++;
        }
        else {
            int x = resb[j] - '0' + flag;
            if (x >= 10) {
                ans.push_back(x % 10 + '0');
                flag = 1;
            }
            else {
                ans.push_back(x + '0');
                flag = 0;
            }
            j++;
        }
    }
    if (flag)
        ans.push_back('1');
    for (int i = ans.size() - 1; i >= 0; i--)
        cout << ans[i];
    return 0;
}

大数减法:
原题链接
大数减法与之类似,但略微复杂一些,这里用数组会好处理一些。

const int MAX = 100000;
int main()
{
 int a_num[MAX] = { 0 }, b_num[MAX] = { 0 };
 string a, b;
 cin >> a >> b;
 int alen = a.size();
 int blen = b.size();
 if (alen < blen || alen == blen && a < b) {
  swap(a, b);
  swap(alen, blen);
  cout << "-";
 }
 for (int i = 0; i < alen; i++) {
  a_num[alen - i] = a[i] - '0';
 }
 for (int i = 0; i < blen; i++) {
  b_num[blen - i] = b[i] - '0';
 }

与大数加法类似,我们先以字符串形式输入数据。我们要用a_num这个数组储存答案,我们就要判定一下是否要把a,b交换。为什么呢?举个栗子,计算15-20,我们是用20-15再添负号的。所以这就要求a要大于b。a大于b的条件是a的长度小于b,或是长度一样但是a的字典序大于b。当a小于b时,我们就要交换a,b。同时由于a<b,我们要在输出一个负号。然后把a的逆序赋给a_num数组。在这之中,a_num[1]储存的是个位数字。b同理。

for (int i = 1; i <= alen; i++) {
  if (a_num[i] < b_num[i]) {
   a_num[i] += 10;
   a_num[i] -= b_num[i];
   a_num[i + 1] -= 1;
  }
  else
   a_num[i] -= b_num[i];
 }

然后我们开始逐位处理,如果a_num[i]<b_num[i],我们就需要借位,直接在该位加十,同时下一位减一。否则直接相减就可。

 while (a_num[alen] == 0 && alen > 1)
  alen--;
 for (; alen >= 1; alen--)
  cout << a_num[alen];
 return 0;

最后输出,但是相减可会导致高位为0,所以要去除所有的0,最后逆序输出即可。
完整代码:

#include<iostream>
#include<string>
using namespace std;
const int MAX = 100000;
int main()
{
	int a_num[MAX] = { 0 }, b_num[MAX] = { 0 };
	string a, b;
	cin >> a >> b;
	int alen = a.size();
	int blen = b.size();
	if (alen < blen || alen == blen && a < b) {
		swap(a, b);
		swap(alen, blen);
		cout << "-";
	}
	for (int i = 0; i < alen; i++) {
		a_num[alen - i] = a[i] - '0';
	}
	for (int i = 0; i < blen; i++) {
		b_num[blen - i] = b[i] - '0';
	}
	for (int i = 1; i <= alen; i++) {
		if (a_num[i] < b_num[i]) {
			a_num[i] += 10;
			a_num[i] -= b_num[i];
			a_num[i + 1] -= 1;
		}
		else
			a_num[i] -= b_num[i];
	}
	while (a_num[alen] == 0 && alen > 1)
		alen--;
	for (; alen >= 1; alen--)
		cout << a_num[alen];
	return 0;

}
大数高精加减乘除(洛谷P1601、P2142、P1303、P1480题题解,Java语言描述) 写在前面 算法归算法,有现成的API能用为什么不用? (纯算法党别喷我,以后我再写高精算法的文) P1601 → A+B Problem 题目要求 P1601题目链接 AC代码(Java语言描述) import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println(scanner.nextBigInteger().add(sca 立即下载

相关推荐

Anolis 8系统下,手把手搞定Nginx、Redis、JDK8和Tomcat9的完整安装与配置(含开机自启)

本文详细介绍了在Anolis 8系统下搭建Java Web全栈环境的完整流程,包括JDK8、Tomcat9、Nginx和Redis的安装与配置,并实现系统级服务管理。通过深入每个组件的配置细节,揭示服务间的协同关系,最终打造一个生产级可用的标准化环境。

weixin_42556197的博客 159

大数加法+大数乘法

文章目录前言一、题目二、大数加法1.思路2.代码三、大数乘法1.思路2.代码四、最后的最后 前言 最近刷题发现很多到高精度问题,一遇到就卡,到处找博客,于是痛下决心决定自己写一遍大数的加法和乘法,本来以为自己写不出来,但最后真的竟然AC了,超级超级nice,感觉自己又可以了 一、题目 大数乘法 洛谷-P1303 大数加法 洛谷-P1601 二、大数加法 1.思路 对于一个多位数的题,可能连longlong都存储不了,但字符串却完全可以。将相加的两个大数都以字符形式存储在字符数组中,循环遍历时转化为数字后再

愤怒的小火柴人 632

当图像配准遇见边缘计算:低功耗设备的优化实践

本文探讨了在边缘计算环境下优化图像配准技术的实践方法,重点解决低功耗设备如树莓派和Jetson Nano上的算力瓶颈问题。通过算法轻量化、硬件加速和内存优化等策略,实现了毫秒级图像配准,适用于智能安防、移动医疗等实时性要求高的场景。

weixin_29054195的博客 387

大数相加(A+B)(超详细)!

大数相加

xuecde的博客 6415

解读文献(五)------基于阻抗控制

文章目录背景主动柔顺控制阻抗控制基于力的阻抗控制基于位置的阻抗控制力位混合控制 背景 主动柔顺控制 阻抗控制 基于力的阻抗控制 基于位置的阻抗控制 力位混合控制 ...

accumulation 1万+

42页Claude 3技术报告解读(Opus, Sonnet, Haiku)

在Claude 3模型中,增加了一个额外的原则到Claude的宪法中,以鼓励尊重残疾人权利,这一原则源自对集体宪法AI的研究。Claude 3模型的训练基于专有的混合数据集,包括截至2023年8月互联网上公开可用的信息,以及第三方提供的非公开数据、数据标注服务和付费承包商提供的数据,还有内部生成的数据。这些初始响应通常包含有害和有毒的内容。Claude 3模型家族在推理、编码和问答任务上展现出卓越的性能,特别是在行业标准基准测试中取得了显著的提升,证明了其在处理复杂问题和提供准确答案方面的能力。

具身机器人和通用AI 2436

大数运算(加、减、乘、除)

文章目录前言一、大数加法1. 基本思想2. 代码实现二、大数减法1. 基本思想2. 代码实现三、大数乘法1. 基本思想2. 代码实现四、大数除法1. 基本思想2. 代码实现 前言 一、大数加法 1. 基本思想 2. 代码实现 二、大数减法 1. 基本思想 2. 代码实现 三、大数乘法 1. 基本思想 2. 代码实现 四、大数除法 1. 基本思想 2. 代码实现 ...

2021dragon的博客 1万+

Oracle EBS和华为MetaERP在会计科目(COA)设计上的观察非常精准。这两种设计确实代表了两种截然不同的系统架构思想,我们可以从设计哲学、优劣对比和演进关系三个方面进行深入分析。

OracleEBS与华为MetaERP的COA设计对比分析 OracleEBS采用弹性域架构,通过固定段数字符串实现多维度核算,强调稳定性和全球统一标准,但修改成本高、扩展性受限。华为MetaERP采用解耦架构,将核算单元、自然科目和核算维度分离,支持动态扩展和灵活调整,更适合业务快速变化的企业。 OracleEBS优势在于强一致性和成熟稳定,劣势是灵活性差;华为MetaERP优势是极致灵活性,劣势是对管理要求高。两者代表了不同时代的企业软件设计理念:OracleEBS适合标准化需求,MetaERP则面向快

金牌架构师 429

大数相加算法

在我们使用的基本数据类型里面,他们都是有一定的范围的,从下图可以看出,每个数据类型都是有一定范围的,他们虽然可以帮助我们进行大部分的计算问题,但是在生活中我们会遇到很多的问题,如果我们想要进行计算的数字长度大于了我们的这些基本数据类型所存储的范围,我们就需要进行大数之间的操作了,今天我们就来看看大数之间的加法计算。在洛谷中就有这道题,大家可以先去了解一下,然后帮助我们后面的学习。P1601 A+B Problem(高精) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

z3551906947的博客 1047

基于ESP32的智能健康监测系统开发

本文介绍了如何基于ESP32开发智能健康监测系统,从硬件选型、系统架构到软件实现的每一个环节。通过ESP32的Wi-Fi功能、传感器模块和云平台的结合,我们实现了实时健康数据监测、远程查看、报警等功能。系统的低功耗特性使得其适用于长期健康监测,能够为用户提供更便捷的健康管理方案。随着技术的不断发展,未来智能健康监测系统将进一步发展。例如,增加更多的传感器,提升数据分析能力,甚至通过人工智能算法来预测用户的健康趋势,为用户提供个性化的健康建议。

2201_76125393的博客 1104

Android NDK/JNI面试题大全及参考答案(3万字长文)

是一套工具集合,它允许开发者为Android平台编写原生应用程序或者应用程序的部分模块。NDK 主要用于开发那些需要高性能计算的应用程序,例如游戏引擎、图像处理软件或音频/视频编码解码器等。通过使用 C 或 C++ 编写代码,开发者可以利用硬件加速功能,提高应用性能。NDK 提供了一系列工具来帮助开发者完成从源代码到可执行文件的整个过程,包括编译、链接、调试等功能。

大模型大数据攻城狮的专栏 1257

大整数加法

我的程序:/********************************************************************程序名:大整数加法作者:许文发时间:2009-11-28********************************************************************/#include#includ

smallmuou的专栏 786

python全栈入门到实战【基础篇 02】环境搭建:Python解释器与PyCharm、VSCode编辑器安装配置详解

本文详解Python环境搭建步骤。首先安装解释器(运行代码核心),需从官网下载,选3.8及以上版本(勿选2.x)。Windows安装必勾“Add Python.exe to PATH”,验证用`python --version`;Mac选universal2安装包,验证用`python3 --version`。 编辑器二选一:PyCharm社区版(免费,新手推荐),安装后需配置解释器路径;VSCode轻量,需装Python插件并选择解释器。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 5万+

c++ · 高精度加减(大数加减)

find_first_not_of()与find_last_not_of()函数,erase()函数,static_cast转换

2403_88102829的博客 2466

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

高精度算法——加减

我们知道,每道让我们输入的题目都会现在输入数据的类型和范围这里我们可以看到最大的范围是10^308次方,这些范围也足够大部分题目的输入,但是往往有需要上千位数字,甚至是上百万位的范围输入,这时我们就需要用到我们的高精度算法。在高精度算法中,数据的输入要使用字符串,然后在后面将字符串的数字用一个数组存下,后面再将数组输出。

2301_80314483的博客 836

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

高精度加法和高精度减法

高精度加法,高精度减法

脑子不好的小菜的博客 1000

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

大数的四则运算(加法、减法、乘法、除法)

前言: 在计算机中数字表示的范围是有限制的,比如我们熟知的 int、float、double 等数据类型所能表示的范围都是有限的,如果我们要对位数达到几十位、几百位、上千位的大整数进行计算,这些数据类型显然不能满足我们的要求,因此我们需要通过算法来实现这些功能。 1、大数加法 两个大数我们可以用数组来保存,然后在数组中逐位进行相加,再判断该位相加后是否需要进位,为了方便...

weixin_30266829的博客 2329

ZZULIOJ 1151: 大整数加法

题目描述比利经常会碰到超大整数的加法运算,而普通的计算器上无法进行。因此他想你帮他写一个程序来计算结果。 输入输入数据有多组。首先输入一个整数T,表示有T组输入。 每组输入两个大整数,并用空格隔开。每个整数最多1000位。没有负数输入。 输出对于每组输入,输出两个整数的和,单独占一行。 样例输入2 1 2 112233445566778899 998877665544332211 样例输出3 11...

bravo的博客 2674

洛谷 P1601 A+B Problem(高精)大数加法_2

P1601 A+B Problem(高精) 分析 简单易懂, 就是在靠高精度大数加法, 很久前(假期的时候)学习过这个知识点, 但很久没用有点忘记了(主要是忘记步骤), 而且也新学习了C++的string类, 故用新的方法重新做一次这道题 先放代码(注: 使用string实现高精度运算的思路来自洛谷题解https://www.luogu.com.cn/blog/user28954/solution-p1601,) 代码实现 #include<string> #include<iost

DonoToT的博客 385

大数的加减法(C语言版)

大数:首先大数就是超出比 long long int 范围的数值。那么超出范围后应该怎样计算呢。下面就介绍大数的加减法 大数加法 对于初学者来说代码可能会有点长,但是原理很简单的。 AC: #include <stdio.h> #include <stdlib.h> #include <string.h> char s1[1001],s2[1001];//首先定义两个字符数组来输入大数。 int a[1001]= {0},b[1001]= {0},c[5000]=

m0_51690407的博客 4490

luogu 高精度加减类型 【模版+】

总结 这次是没有具体的题目了,就是单纯地完善了上次的高精度的模版,支持了正负数加减。 Code // head files excluded using namespace std; const int N = 15000; struct BigInt{ int data[N]; int size; // size域 显式声明 bool nega;// 记录符号...

蟋蟀的博客 221

【洛谷】P1015 大数加法和回文数的制作方法

临时写作,方法已经有了,之后有时间再修改。 /*大数加法和回文数的制作方法&lt;版本一&gt;*/ /*P1015*/ #include &lt;bits/stdc++.h&gt; using namespace std; int digits[100]; void add(string num) { int len = num.length(); for(int i=len-1...

vbals的博客 396

大整数加法(模板)

注意: 在main函数计算过程中必须注意前导0; string字符串进行计算:(还有待优化) string add(string s1,string s2) { string max,min; if(s1.length()&gt;s2.length()) { max=s1;min=s2; } else { ...

兜率工的博客 650

高精度算法(大数加减乘除)

在C/C++的算法题中有时候会遇见这样一类问题,数据实在是太大了,就连unsigned long long也不能描述这样的数据(数据已经大于了264),遇见这样的数据,我们就需要使用高精度来进行描述了高精度的主要思想是将数位拆分并单独对每一位进行存储,有多种高精度描述数据的方法,比如int型的数组,字符串等等方式,在这里我们所使用的方法是使用vector即int型的动态数组进行数据的描述新手向基础算法教程,所以我们此处只提到大数加减乘除。

m0_73604362的博客 2010

[C/C++] -- 大数的加减法

大数加减法的问题主要产生于计算机基本数据类型的表示范围限制。

Afison的博客 831
上一篇: P1217 [USACO1.5]回文质数 Prime Palindromes
下一篇: 洛谷P1049——装箱问题
~VEGETABLEBIRD~
博客等级 码龄7年 5粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值