高精度算法

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

高精度算法

问题的引入

由于计算机运算是有模运算,数据范围的表示有一定限制,如整型int(C++中int 与long相同)表达范围是(-2^31~2^31-1),unsigned long(无符号整数)是(0~2^32-1),都约为几十亿.如果采用实数型,则能保存最大的double只能提供15~16位的有效数字,即只能精确表达数百万亿的数。因此,在计算位数超过十几位的数时,不能采用现有类型,只能自己编程计算。

目前在青少年信息学奥林匹克竞赛中所涉及到的高精度计算包括加(addition)、减(subtract)、乘(multiply)、除(divide)四种基本运算。

此外,在C++语言中,int类型(4个字节/32位计算机)元素存储十进制的一位数字非常浪费空间,并且运算量也非常大,因此常将程序代码优化为万进制,即数组的每个元素存储高精数字的四位。

(为什么选择万进制,而不选择更大的进制呢?十万进制中的最大值99999相乘时得到的值是9999800001超过4个字节的存储范围而溢出,从而导致程序计算错误。)

本文以暂时以10进制为例讲述高精度算法

一、高精度数字的存储

高精度计算通用方法:高精度计算时一般用一个数组来存储一个数,数组的一个元素对应于数的一位(当然,在以后的学习中为了加快计算速度,也可用数组的一个元素表示数的多位数字,暂时不讲),表示时,由于数计算时可能要进位,因此为了方便,将数由低位到高位依次存在数组下标对应由低到高位置上,另外,我们申请数组大小时,一般考虑了最大的情况,在很多情况下,表示有富余,即高位有很多0,可能造成无效的运算和判断,因此,我们一般将数组的第0个下标对应位置来存储该数的位数.如数:3485(三千四百八十五),表达在数组a[10]上情况是:

下标0 1 2 3 4 5 6 7 8 9

内容 4 5 8 4 3 0 0 0 0 0

说明:位数个位十位百位千位

例:一个不超过200位的非负整数,可能有多余的前导0。

#include

#include

#include

#include

#include

#include

#include

using namespace std;

const int maxn=220;

const int maxlen=5001;

int a[maxn],b[maxn],c[maxlen],d[maxlen];

char str1[maxn],str2[maxn];

void init(char str[],int num[]){

int len=strlen(str);

int i,pos=0;

while(str[pos]=='0'&&pos

num[0]=len-pos;//下标0处存放位数

}

int main(){

int i;

scanf("%s",str1);

init(str1,a);//将字符串str1初始化到a数组中

return 0;

}

二、高精度算法

说明: int a[maxn],b[maxn],c[maxlen];

a为数1,b为数2,c存放计算结果

1. 高精度数比较

int cmp(){//比较a和b的大小关系,若a>b则为1,a

int i;

if (a[0]>b[0]) return 1;//a的位数大于b则a比b大

if (a[0]

for(i=a[0];i>=1;i--) //从高位到低位比较

{if (a[i]>b[i]) return 1;

if (a[i]

return 0;//各位都相等则两数相等。

}

2.高精度加法

10:大整数加法/ch0106/10/

求两个不超过200位的非负整数的和。

输入

有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

输出

一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

样例输入

22222222222222222222

33333333333333333333

样例输出

55555555555555555555

#include

#include

#include

#include

#include

#include

#include

using namespace std;

const int maxn=220;

const int maxlen=5001;

int a[maxn],b[maxn],c[maxlen];

char str1[maxn],str2[maxn];

void init(char str[],int num[]){

int len=strlen(str);

int i,pos=0;

相关文档
最新文档