所谓的高精度运算,是指参与运算的数据的范围大大超出了标准数据类型。
int占4个字节的存储空间,数据范围从~
的整数。
long long占8个字节的存储空间,数据范围从~
的整数。
显然我们想计算是不够用的。所以我们要用到高精度计算。其实也就是利用一维数组来存储更大的值。
注意:高精度计算首先要处理好数据的接收和存储问题,其次要处理好运算过程中的”进位“和”借位“的问题。
需思考如何输入,可以利用字符串输入高精度数据,还要考虑是否有进位以及结果的输出。
#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<
程序运行结果如下:
高精度的加法主要注意进位问题,那么高精度减法主要注意借位处理以及输出是否为负。
#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<
注:判断两数大小的代码也可以再写一个自定义函数进行比较,使代码更具模块化思想。
程序运行如下:
用一个数的每一位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集群简介