C++:用字符串数组实现大数运算,以两个不高于40位的大数运算为例。
因为基本数据类型中整型的内存范围有限,所以直接进行大数之间的运算,不仅浪费空间,而且运行缓慢,甚至有些会导致数据溢出。
那怎么办呢?
这时我们就想直接不行,那咱们来间接的。
这就是我们今天主要要讲的:通过字符串来进行大数计算。
1、首先预处理和命名空间自不必说

2、声明所需字符串数组(这里以最大40位大数为例,所以字符数组长度设为41,最后一个留给'\0'),记录字符串长度,并对字符串长度进行记录。声明数组并对其初始化。(适当可加异常处理)

3、将数字字符串逆序添加到数组中(字符与相应数字的存储相差48)。

4、首先判断A 和 B两字符串的长度,根据长度来进行选择判断条件。因为相加的算法是按位相加,所以或长或短决定了'+'的操作。
花开两朵,各表一枝。咱们只看第一个循环结构就行。第一个循环结构,假设A_len>B_len(在最前面的flag判断),当有余位进行相加运算时,先将最小位的数相加(+x)为的是进位,再进行取余保留在原位。相加运算结束后,接着就是按序储存剩下长的没有运算的数了。最后逆序输出(因为我们是逆序相加存储的)

5、下面送上完整代码
#include<iostream>#include<stdio.h>#include<cstring>using namespace std;
int main(){ char A[41],B[41]; gets(A); gets(B); //加一个异常处理程序 int A_len=strlen(A); int B_len=strlen(B); int flag=0; if(strlen(A)>strlen(B)) flag=1; int C[(A_len>B_len ?A_len :B_len)+1],D[A_len],E[B_len]; memset(C,0,sizeof(C)); memset(D,0,sizeof(D)); memset(E,0,sizeof(E)); for (int i=1;i<=A_len;i++) { D[A_len-i]=A[i-1]-48; } for (int i=1;i<=B_len;i++) { E[B_len-i]=B[i-1]-48; } int lenC=0; int x=0;
if (flag){ while(lenC<B_len){ C[lenC]=D[lenC]+E[lenC] +x;
x=C[lenC]/10; C[lenC]=C[lenC]%10; lenC++;}
while(lenC<A_len){ C[lenC]=D[lenC]+x; x=0; lenC++;} } else { while(lenC<A_len){ C[lenC]=D[lenC]+E[lenC] +x; x=C[lenC]/10; C[lenC]=C[lenC]%10; lenC++;} while(lenC<B_len){ C[lenC]=E[lenC]+x; x=0; lenC++;} } C[lenC]=x; if(C[lenC]==0) lenC--; for(int i=lenC;i>=0;i--) cout<<C[i]; cout<<endl; return 0;}
C++:用字符串数组实现大数运算,以两个不高于40位的大数运算为例。的更多相关文章
- java大数类,两个不超过20位都不为0的十进制字符串相乘,华为笔试题
import java.math.BigInteger; import java.util.*; import java.io.*; public class Main { public static ...
- Swift - 将字符串拆分成数组(把一个字符串分割成字符串数组)
在Swift中,如果需要把一个字符串根据特定的分隔符拆分(split)成字符串数组,通常有如下两种方法: 1,使用componentsSeparatedByString()方法 1 2 3 4 5 l ...
- C语言为运算及 两个变量的赋值问题
#include <stdio.h>#define ARRAY_SIZE 10int main() { int arr[ARRAY_SIZE] = {51,116,53,120,85 ...
- 探讨js字符串数组拼接的性能问题
这篇文章主要介绍了有关js对字符串数组进行拼接的性能问题,字符串连接一直是js中性能最低的操作之一,应该如何解决呢?请参看本文的介绍 我们知道,在js中,字符串连接是性能最低的操作之一. 例如: 复制 ...
- java求字符串数组交集、并集和差集
import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.Ma ...
- Javascript-常用字符串数组操作
字符串的操作在编写Js的过程中是不可避免的 因为它太多的API 还有相似的API让我们很头痛 为了避免以后遇到模拟两可的问题 还是做个笔记比较好 把常用的字符串操作记录下来成笔记 方便以后查找 No1 ...
- Matlab 之 字符串数组查找
Matlab的优势在于向量操作,字符串操作往往费时费力,但是如果能充分利用Matlab自带的一些函数,也可以取得不错的效果.下面就介绍一下字符串数组查找的小技巧. 字符串数组我通常会选择应用cell格 ...
- C语言学习018:strdup复制字符串数组
在C语言学习005:不能修改的字符串中我们知道字符串是存储在常量区域的,将它赋值给数组实际是将常量区的字符串副本拷贝到栈内存中,如果将这个数组赋值给指针,我们可以改变数组中的元素,就像下面那样 int ...
- .net字符串数组查找方式效率比较
下面是代码: static void Main(string[] args) { string[] arr = new string[] { "AAA", "BBBB&q ...
随机推荐
- TensorFlow 入门 | iBooker·ApacheCN
原文:Getting Started with TensorFlow 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 不要担心自己的形象,只关心如何实现目标.--<原则>,生活原 ...
- CKKS加密方案
本文内容来自"Protecting Privacy throughHomomorphic Encryption",主要学习里面的CKKS部分. CKKS是一种同态加密方案,其安全性 ...
- Java微服务监控及与普罗米集成
一. 背景说明 Java服务级监控用于对每个应用占用的内存.线程池的线程数量.restful调用数量和响应时间.JVM状态.GC信息等进行监控,并可将指标信息同步至普罗米修斯中集中展示和报警.网 ...
- 【XR-4】文本编辑器
直接做是困难的,不妨依照部分分来思考. - Subtask 3 首先会进入一个误区:维护修改,通过循环串的性质在 \(\tt KMP\) 自动机上优化遍历. 但可以发现这样很难处理,我们不妨 直接维护 ...
- HTML与HTTP协议
HTML与HTTP协议 目录 HTML与HTTP协议 一.HTML 1. HTML概述 2. HTML编辑 3. HTML语法规则 4. HTML文件结构 5. HTML基本标签 (1)头标签中常用标 ...
- Java产生指定范围内的随机日期
要想产生指定范围内的随机日期,首先我们要指定一个范围,那么我们可以通过SImpleDateFormat格式化日期,然后再通过parse()方法设置日期,返回一个Date类型的日期对象,再转化为时间戳( ...
- ubuntu Python2 升级Python3
今天买了一台阿里的服务器, 想搭建一个爬虫, 但是 服务器是python2的, 需要升级到python3 1. 下载python3的包 wget https://www.python.org/ftp/ ...
- Solution -「JOISC 2021」「LOJ #3491」道路建设
\(\mathcal{Description}\) Link. 平面上有 \(n\) 个互不重合的点 \((x_{1..n},y_{1..n})\),求其两两曼哈顿距离的前 \(m\) 小值. ...
- Spring Boot数据访问之动态数据源切换之使用注解式AOP优化
在Spring Boot数据访问之多数据源配置及数据源动态切换 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中详述了如何配置多数据源及多数据源之间的动态切换.但是需要读数据库的地方,就 ...
- 针对Office宏病毒的高级检测
前言 攻击者可能发送带有恶意附件的钓鱼邮件,诱导受害者点击从而获取对方的系统控制权限 期间会借助 Atomic 工具完成攻击复现,再对具体的过程细节进行分析取证,然后深入研究.剖析其行为特征 最后输出 ...