高精度加减法

一、高精度运算

什么是高精度运算?我们都知道,数据类型是有大小范围的。如整型数据int能表示的数的范围为:-2147483648至2147483647(-2^31至2^31-1);长整型数据long long能表示的数的范围为:-9223372036854775808~9223372036854775807(-2^63至2^63-1)。那么当所要求解的数的大小还要再大时,就不能使用上述的方式存储数据进行运算。此时我们可以使用高精度数在储存(数组)。

二、高精度加法

高精度加法,实际上就是我们从加法的定义出发,利用数组表示每一位,通过"竖式运算"的方式进行进位相加,最终得出答案。为了保证数字的连贯,我们可以使用字符串或字符数组来表示,之后再利用相应的ASCII码值进行转换即可。

//先定义两个字符串

string str1,str2; //使用字符数组,则是已知数据的长度,若不清楚可采用字符串

cin>>str1;//注意这个时候我们输入的数字就用字符串来表示了

cin>>str2;

想想我们列竖式计算加法时的思想是怎样的:将两个数字对应的个,十,百...位都对齐进行相对应的加法计算,满10就进1,不满则不进。从个位开始对齐,如果因为两个数字 的位数不同而导致其中一个数字的高位没有对应的数字对齐,那么我们就要在另一个数字对应的位置上进行空位补0(默认就是为0)。

len1=str1.size();

len2=str2.size();

复制代码
 for(int i=0;i<len1;i++)
   a[len1-i]=str1[i]-'0';
 for(int i=0;i<len2;i++)
    b[len2-i]=str2[i]-'0';

既然我们已经用字符数组的形式将数字表示了出来,那我们就可以利用取对应下标的方法将对应的数字进行相加。但我们要注意一个问题:我们通常的列竖式加法运算是从末尾开始逐次相加,对应到我们的字符数组中,我们就要得到两个字符数组中较长的作为边界条件,来写这个for循环。

复制代码
   len=max(len1,len2);
  for(int i=1;i<=len;i++)
  {
    c[i]=c[i]+a[i]+b[i];
    c[i+1]=c[i]/10;
    c[i]=c[i]%10;
  }
  if(c[len+1]!=0) len++;//两个数相加,位数最多只会增加一位

实现一切之后,我们就可以输出。注意,输出时数组里的第1位是最后才输出的。

复制代码
  for(int i=len;i>=1;i--)
   cout<<c[i];

三、高精度减法

只能实际大的数减少的数,所以要对输入 的两个数(字符串)的大小先进行比较。

一般把这个比较写成独立的函数:

int check(string st1,string st2)

{

int len1=st1.size();

int len2=st2.size();

if(len1<len2) return -1;

if(len1>len2) return 1;

for(int i=0;i<len1;i++)

{

if(st1i<st2i) return -1;

if(st1i>st2i) return 1;

}

return 0;

}

int main()

{

cin>>str1>>str2;

if(check(str1,str2)==-1)

{

swap(str1,str2);

p=1; //标志是小数减大数

}

len1=str1.size();

len2=str2.size();

for(int i=0;i<len1;i++)

alen1-i=str1i-'0';

for(int i=0;i<len2;i++)

blen2-i=str2i-'0';

len=max(len1,len2);

for(int i=1;i<=len;i++)

{

ai=ai-bi;

if(ai<0) //借位

{

ai+1--;

ai+=10;

}

}

while (alen==0&&len>1) len--; //相减后的位数处理

if(p==1) cout<<"-";

for(int i=len;i>=1;i--)

cout<<ai;

}

相关推荐
xcl09252 小时前
幼儿托育系统开发实战:从需求分析到上线全流程指南
java·大数据·需求分析
吴声子夜歌2 小时前
ApacheCommons——commons-cli(命令行参数解析)
java·开发语言·apache
小小猪的春天2 小时前
Java 手写第一个 MCP Server:Spring AI MCP 半小时跑通
java·人工智能·spring boot·ai编程
find1star2 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing2 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21123 小时前
力扣160 21 86
算法·leetcode·职场和发展
今天AI了吗3 小时前
DeepSeek Harness 深度解析:从评测架构到实战落地
java·网络·数据库·人工智能·架构·java-ee
许彰午3 小时前
27-AuthService登录链路
java·低代码·架构
泡海椒4 小时前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp
小智老师PMP4 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理