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

 

posted @ 2021-10-26 21:53  chanxe  阅读(316)  评论(0编辑  收藏  举报