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 ...
随机推荐
- 幂等性是数学中的一个概念,表达的是N次变换与1次变换的结果相同
幂等性是数学中的一个概念,表达的是N次变换与1次变换的结果相同
- Dapr 和 Azure Functions : Hello world
本篇文章内容来自 https://charliedigital.com/2021/07/01/dapr-and-azure-functions-part-1-hello-world/ ,是按这篇文章的 ...
- Maven的安装、配置与使用
5.Maven 我为什么要学习这个技术? 在JavaWeb开发中,需要使用大量的jar包,我们手动去导入: 如何能够让一个东西自动帮我们导入和配置这个jar包. 由此,Maven诞生! 5.1.Mav ...
- CF1408G Clusterization Counting
首先,我们需要给一个连通块找到一个直观的合法判定解. 那么我们必须以一种直观的方式将边按照权值分开,这样才能直观地判定一个合法的组. 一个常见的方式是将边从小到大依次加入进来,那么在任意时刻图上存在的 ...
- div 根据内容自适应内容
转载请注明来源:https://www.cnblogs.com/hookjc/ #header{ MARGIN: 0px; BORDER: 0px; BACKGROUND: #ccd2de; WIDT ...
- 怎么实时同步java虚拟机与操作系统时区 及JVM启动后再更改操作系统时区或时间也能保持其同步? new date() 时差8个小时的解决方案
第一种(亲测可以) 在代码当中的Application启动类当中加入代码 @PostConstruct void started() { //时区设置:中国上海 //time.zone: " ...
- uos系统离线状态下进入开发者模式
需到处机器信息,接着登入指定的uos开发者网站,下载证书,然后在机器上加载证书,重启即可.
- 生产环境搭建高可用Harbor(包括恢复演练实操)
生产环境搭建高可用Harbor(包括恢复演练实操) 前言 因资源成本问题,本Harbor高可用架构为最小开销方案,如果资源充足,可以将PG.Redis全部使用使用云厂商集群模式. 同时为了配置简单,并 ...
- 《PHP程序员面试笔试宝典》——什么是职场暗语?
本文摘自<PHP程序员面试笔试宝典> 文末有该书电子版下载. 随着求职大势的变迁发展,以往常规的面试套路因为过于单调.简明,已经被众多"面试达人"们挖掘出了各种&quo ...
- Solution -「LOCAL」客星璀璨之夜
\(\mathcal{Description}\) OurOJ. 给定坐标轴上的 \(2n+1\) 个坐标 \(x_1,x_2,\cdots,x_{2n+1}\),其中偶数下标的位置是一个小球 ...