ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++:用字符串数组实现大数运算,以两个不高于40位的大数运算为例。

2021-10-26 22:01:23  阅读:134  来源: 互联网

标签:lenC 运算 为例 int 相加 大数 len C++ 字符串


因为基本数据类型中整型的内存范围有限,所以直接进行大数之间的运算,不仅浪费空间,而且运行缓慢,甚至有些会导致数据溢出。

那怎么办呢?

这时我们就想直接不行,那咱们来间接的。

这就是我们今天主要要讲的:通过字符串来进行大数计算。

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;
}

 

标签:lenC,运算,为例,int,相加,大数,len,C++,字符串
来源: https://www.cnblogs.com/chanxe/p/15468073.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有