【C++算法】高精度运算及模拟
创始人
2025-05-29 01:02:41
0

一.高精度运算

所谓的高精度运算,是指参与运算的数据的范围大大超出了标准数据类型。

int占4个字节的存储空间,数据范围从^{}-2^{31}~2^{31}-1的整数。

long long占8个字节的存储空间,数据范围从^{}-2^{63}~2^{63}-1的整数。

显然我们想计算10^{1000}+10^{1000}是不够用的。所以我们要用到高精度计算。其实也就是利用一维数组来存储更大的值。

注意:高精度计算首先要处理好数据的接收和存储问题,其次要处理好运算过程中的”进位“和”借位“的问题。

1.高精度的加法

需思考如何输入,可以利用字符串输入高精度数据,还要考虑是否有进位以及结果的输出。

#include
#include 
using namespace std;
int a[1010],b[1010],c[1010];  //两个加数及和 
int lena,lenb,lenc,i;
void sumn(int a[],int b[]){lenc=lena;if(lena=10){c[i+1]=1;  //需进位 c[i]=c[i]-10; } }if(c[lenc]>0) lenc++; //处理最高位的进位 
}int main(){string s1,s2;  //两个加数 cin>>s1>>s2;lena=s1.size(); lenb=s2.size();for( i=0; i=0; i--){cout<

程序运行结果如下:

2.高精度减法

高精度的加法主要注意进位问题,那么高精度减法主要注意借位处理以及输出是否为负。

#include
#include
using namespace std;  
int a[1010],b[1010],c[1010];  //两个数及差 
int lena,lenb,lenc,i;
void subt(int a[],int b[]){lenc=lena;if(lena>s1>>s2;lena=s1.size(); lenb=s2.size();for( i=0; ilenb){   //想到输出负号的情况 subt(a,b);  //求差 subtraction减法 }else if(lenas2){subt(a,b);}else{cout<<"-";subt(b,a);}} for( i=lenc-1; i>=0; i--){cout<

注:判断两数大小的代码也可以再写一个自定义函数进行比较,使代码更具模块化思想。 

程序运行如下:
 

 3.高精度乘法

用一个数的每一位a[i](从低位开始)逐位与另一一个数的每一位b[j]相乘,高精度乘法需要注意及时进位,否则会造成溢出。

#include
#include
using namespace std;  
int a[1010],b[1010],c[1010];  //两个数及乘积 
int lena,lenb,lenc,i,j,k;  
void mult(int a[],int b[]){for( i=0; i=10){   //防止溢出,需再次进位 c[k+1]+=c[k]/10;c[k]=c[k]%10;k++;}}}lenc=lena+lenb;while(c[lenc]==0 ) lenc--;  //最高位为0
}int main(){string s1,s2;  //两个数 cin>>s1>>s2;lena=s1.size(); lenb=s2.size();for( i=0; i=0; i--){cout<

程序运行如下:

 二.模拟

模拟一般是模拟一个游戏的对弈过程,或者模拟一项任务的操作过程,进行统计激发、判断输赢等。这些问题一般很难建立数学模型用特定的算法解决,所以需要模拟各种情况。一定要分析全面,各种特例及规则都不漏掉。

例题:分别计算在 11 分制和 21 分制下,双方的比赛结果(截至记录末尾)。

比如现在有这么一份记录,(其中 W 表示华华获得一分,L 表示华华对手获得一分):

WWWWWWWWWWWWWWWWWWWWWWLW

在 11 分制下,此时比赛的结果是华华第一局 11 比 0 获胜,第二局 11 比 0 获胜,正在进行第三局,当前比分 1 比 1。而在 21 分制下,此时比赛结果是华华第一局 21 比 0 获胜,正在进行第二局,比分 2 比 1。如果一局比赛刚开始,则此时比分为 0 比 0。直到分差大于或者等于 2,才一局结束。

你的程序就是要对于一系列比赛信息的输入(WL 形式),输出正确的结果。

输入 

WWWWWWWWWWWWWWWWWWWW
WWLWE

输出

11:0
11:0
1:121:0
2:1

我们需要做的就是分析每一种情况下,选手的得分情况,只有当某一个选手的得分等于计分制并且两人分数差大于等2才可输出。

#include
#include 
#include
using namespace std;
string s[2510];   
int i,j,cnt,cw,cl; //统计输入几行 ,cw统计w出现次数 ,cl统计l出现次数 
void grade(int n){  //n分制 cl=0,cw=0;  //初始化 for(i=0; i=n || cw >=n )&& abs(cw-cl)>=2){cout<>s[i]){  //输入 i++;cnt++;}grade(11);  cout<

总结

本文简单介绍了高精度算法的基本原理,注意要处理好借位、进位、以及是否溢出等问题,模拟算法就是模拟每一种情况,分析全面即可。

上一篇:mysql集群简介

下一篇:Ubuntu安装X265+FFMPEG

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...