一.引言

对于数字的储存,用实数类型总会有一些不足,比如:

使用int 只能最多存储4个字节,范围也就是2的32次方;

使用double 只能最多储存8字节,就是2的64次方;

如果数字超过这个限制,就会发生溢出,导致结果错误。那么我们该如何解决呢?

为了解决这个问题,我们就要回归到我们小学所学的知识  :

列式计算

二.一般步骤:

1.高精度加法:

a.将字符组转化为数组(注意顺序问题,影响到后续计算)

b.计算是否进位,如果进位则下一个结果项加上进位数

c.将两个数组各项以及进位相加,得到结果的数组

d.按顺序输出(顺序取决于第一步的顺序)

PS:减法只是将进位换位借位,大体不变

2.高精度减法:

a.提前开一个数组,以存放未除尽的的的数

b.将字符组转化为数组(注意顺序问题,影响到后续计算)

c.用除法结果作为这一位的结果,用求余来放到开的数组里

d.按顺序输出(顺序取决于第一步的顺序)

PS:这个说的有点抽象,具体可参考第二个例题

3.高精度乘法乘法:

a.提前开一个数组,以存乘积后的的的数

b.将字符组转化为数组(注意顺序问题,影响到后续计算)

c.需要注意乘法的数组长等于两个相乘数组长度之和

c.乘法结果作为这一位的结果,放到开的数组里

e.如果大于10,对10的余数加到下一位,这一位留下除以10的值

d.按顺序输出(顺序取决于第一步的顺序)

三.例题

1.高精度加法:

首先看一个代码,这是早期人类初步接触高精度加法时的 “ 作品 ” :


#include<bits/stdc++.h>
using namespace std;int main()
{char a[100],b[100];//用于记录2个高精度数的每一位char aa[100],bb[100];//后期用于储存没有前导零的字符组for(int i=0;i<100;i++){aa[i]=bb[i]='0';}int m=0,n=0;int sum=0,sum_=0;//标记2个字符组的位数char x;while((x=getchar())!='\n'){a[m]=x;m++;} while((x=getchar())!='\n'){b[n]=x;n++;} //输入两字符组int a_=0,b_=0;int c_=max(m,n);//a_,b_代表处理过前导零后的位数
//c_代表两者字符组所含更大的位数for(int i=0;i<c_;i++){if(a_==0&&a[i]=='0')continue;else if(i>=m)continue;else {   aa[a_]=a[i];sum_++;a_++;}}reverse(aa,aa+a_);      for(int i=0;i<c_;i++){if(b_==0&&b[i]=='0')continue;else if(i>=n)continue;else {bb[b_]=b[i];sum++;b_++;}}//去除前导零,比如:008->8reverse(bb,bb+b_);//反转操作,将顺序调整int ma=max(sum,sum_); char k[101];int st=0;//st代表进位for(int i=0;i<ma;i++){int q=aa[i]-'0'+bb[i]-'0';k[i]=char((q+st)%10+'0');st=q/10;       }if(st!=0) cout<<char(st+'0');for(int i=ma-1;i>=0;i--){cout<<k[i];}cout<<endl;return 0;
} 

这个代码的问题有以下几点:

1.处理前导零的时间过早,导致步骤冗杂

2.没有第一时间将字符组转化为数组

3.对字符组中字符的顺序没有处理好,导致顺序错乱,使代码凌乱

2.高精度加,乘,除

再看一个比较简洁的代码,这个已经解决了如上的问题,并按照正常顺序书写:

首先用等差数列求和计算出 n*(n+1)/2

所以,先计算n+1:

for(int i=0;i<len;i++){a[len-1-i]=s1[i]-'0';}//直接进行了换位操作 b[0]=a[0]+1;                    //这个地方不要处理余数 ,会影响后面求除法那步 for(int i=1;i<=len;i++){b[i]=a[i]+b[i-1]/10;}for(int i=0;i<len;i++){b[i]%=10;}if(b[len]>0) len++;

然后,计算n*(n+):

for(int i=0;i<s1.length();i++){for(int j=0;j<len;j++){int k=i+j;//注意处理乘积的位数 c[k]+=a[i]*b[j];//切记谁对应i,谁对应j if(c[k]>=10){c[k+1]+=c[k]/10;c[k]%=10;}}}len=s1.length()+len+1;if(c[len]>0) len++;while(c[len-1]==0&&len>1) len--;//去首位的0 

一定要注意谁对应 i,谁对应 j ,笔者因为这个问题调试了半个小时。

最后,计算除2的值: 

 int t=0;for(int i=len-1;i>=0;i--){d[i]=(c[i]+t)/2;t=c[i]%2*10;} while(d[len-1]==0&&len>1) len--;//去除前导零for(int i=len-1;i>=0;i--){cout<<d[i];}

拼接起来组成完整代码: 

#include<iostream>
#include<string.h>
using namespace std;int main()
{string s1;int a[105]={0},b[105]={0},c[205]={0},d[205]={0};cin>>s1;int len=s1.length();for(int i=0;i<len;i++){a[len-1-i]=s1[i]-'0';}//直接进行了换位操作 b[0]=a[0]+1;                    //这个地方不要处理余数 ,会影响后面求除法那步 for(int i=1;i<len;i++){b[i]=a[i]+b[i-1]/10;}for(int i=0;i<len;i++){b[i]%=10;}if(b[len]>0) len++;//注意部位 for(int i=0;i<s1.length();i++){for(int j=0;j<len;j++){int k=i+j;//注意处理乘积的位数 c[k]+=a[i]*b[j];//切记谁对应i,谁对应j if(c[k]>=10){c[k+1]+=c[k]/10;c[k]%=10;}}}len=s1.length()+len+1;if(c[len]>0) len++;while(c[len-1]==0&&len>1) len--;//去首位的0 int t=0;for(int i=len-1;i>=0;i--){d[i]=(c[i]+t)/2;t=c[i]%2*10;} while(d[len-1]==0&&len>1) len--;for(int i=len-1;i>=0;i--){cout<<d[i];}return 0;
} 

其实,高精度唯一需要注意的两点就是:

  1.注意进位和借位

                2.注意字符组中的顺序

注意到这些,再多加练习,就可以想写低精度加法一样顺利了。

以上就是今天分享的内容了,希望对有需求的码友有帮助。

高精度加法 高精度减法 高度除法 高精度乘法 方法总结相关推荐

  1. 计算机上表格怎么算减法,excel表格中怎么计算减法、除法、乘法

    我们工作中会经常遇到很多时候需要计算数据的加.减.乘.除等等.这时候简单的excel计算使用很有必要,同时也能为我们省去很多的时间,和计算误差.下面就介绍一种非常简单的使用方法. 我们先用excel中 ...

  2. (压位)高精度乘法,高精度加法,高精度减法,高精度除法

    大值 乘 大值: 题目链接:https://www.luogu.com.cn/problem/P1303 # include <iostream> # include <string ...

  3. 用C++的类重载高精度加法,乘法和等于符号

    运行结果: 代码如下: #include<iostream> #include<algorithm> #include<string.h> #include< ...

  4. 高精度加法(C语言实现)

    高精度,是学C语言漫长的路上必须要学的一类程序 >>>高精度模板( 加,减,乘低精高精,除低精高精(有余数),高精阶乘(200000以内) ) (C语言实现)(注释多多)<&l ...

  5. 试解PTA《20211122-函数基础练习》,涉及 高精度加法 和 10进制转换成2-16进制问题,有需要的同学来看看吧;

    目录 一.前言 二.例题部分 2.1.进制转换 2.1.1.题解1 2.1.2.题解2 2.2. 函数返回一个整数的反序数 (20 分) 2.2.2 题解 2.3. 大整数A+B (10 分) 2.3 ...

  6. 高精度加法【c++实现】

    其他高精度算法如下: 高精度减法[c++实现] 高精度乘法[c++实现] 高精度除法[c++实现] ------------------------------ 说在前面: 众所周知 int,long ...

  7. 高精度加法------C++

    在编程题里有这么一种类型的题目,大数运算,大数有多大呢?特别大,特别大,超过了基本类型的范围,高精度肯定也有四则运算吗,这里主要讲加法,减法乘法除法,后续在讲,喜欢的的记得点个关注哦,这里就介绍高精度 ...

  8. C语言丨小 学 数 学(一):高精度加法

    计算机,顾名思义,是用于高速计算的电子计算机器.它可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能.是能够按照程序运行,自动.高速处理海量数据的现代化智能电子设备.[1]但是,计算机的功能毕竟 ...

  9. 基础练习 高精度加法

    基础练习 高精度加法 时间限制:1.0s 内存限制:512.0MB 问题描述 输入两个整数a和b,输出这两个整数的和.a和b都不超过100位. 算法描述 由于a和b都比较大,所以不能直接使用语言中的标 ...

最新文章

  1. graylog2安装
  2. Json,Hashlib与Base64(占坑待补)
  3. 前端学习(2169):vue-router安装和配置方式
  4. Linux内核自旋锁
  5. 只想着一直调用一直爽, 那API凭证泄漏风险如何破?
  6. 腾讯视频QLV格式转换为MP4格式
  7. 使用Visio 2003 + Oracle 11g创建ERD,反向工程师失败了吗?
  8. matlab香农编码,用MATLAB编程实现香农编码.doc
  9. 人脸识别系统技术方案
  10. UOJ【UR #12】实验室外的攻防战 题解
  11. 吴恩达机器学习笔记(七)神经网络:代价函数
  12. Codeforces711C 【DP】
  13. Visual Studio 2017十五项新功能体验
  14. VS2022配置OpenCV 4.3.0报错解决办法
  15. MATLAB/Simulink 线性分析工具箱频域分析(手把手教会)
  16. web项目 Eclipse 中 jsp 页面 没有代码提示
  17. Java 查找数组中某个数字的下标
  18. CH376的串口模式操作U盘(读、写、txt文件、csv文件、串口调试讲解、stm32程序)
  19. 基于PHP的校园视频点播系统,基于ThinkPHP框架的IPv6视频点播系统的实现
  20. NOI openjudge 6043:哆啦A梦的时光机(双向宽搜)

热门文章

  1. 数据恢复技术练习题(百道)
  2. VUE-Vuetify框架
  3. excel打不开_excel表格打不开怎么办?excel表格打不开的解决方法
  4. 2PC、3PC、TCC
  5. ttf-dejavu fontconfig字体
  6. Unity3D基础知识之Camera摄像机及其属性
  7. ASO优化:为什么要做APP竞品分析
  8. java设计四个按钮分别命名为,计算器 1.0
  9. SAP术语总结详细版(转)
  10. 开源精选:AntdFront —— React 纯 Hook 多标签微前端管理系统解决方案