我们都知道 int类型占32bit 可表示范围: [-2147483648,2147483647] long long类型 64bit可表示范围:[-9223372036854775808,9223372036854775807]

int可以完整表达9位数字,long long可以完整表达18位。(完整表达的意思是能表示到该位的任意数字)

当我们想表达到成千上万位的数时,int、long long都不再适合。所以我们便引入高精度的概念。

所谓高精度就是用数组来充当数字的容器。开辟若干个空间,每个单元内存放固定数目的数据。

高精度常用的方法主要有:不压缩法、压缩4位法、和压缩9位的方法。

不压缩法:主要是用char类型开辟的数组,每个元素内存放一位数字。

例如:

2156897546

用普通不压缩方法存储,其数据结构为:

6 4 5 7 9 8 6 5 1 2

注意:此时数组中存放的是数值并不是ASCll对应的字符!之所以倒序存放是为了便于以后进行运算时溢位的情况。

压缩4位法:用int类型开辟的数组,每个元素内存放四位数字。

ps:为什么是四位呢?因为int类型能完整表达9位以内的任何数字。而存储四位数字是因为在进行乘法运算时,很可能会存在四位×四位的情况,而其结果不会超过八位。int类型完全可以存储。如果存放四位以上的数字的时候,int不能完整的存放其结果,因而无法正确计算。

例如:

2156897546

用压缩4方法存储,其数据结构为:

7546 5689 21

特点:自右向左每选取4位存放至数组一个单元内。最后不够的单独放一个空间。(四位内部还是正序的,总体是逆序的)

压缩9位法:与压缩4位法大致相同,区别在于存放的数组是用long long类型开辟的,每个元素内存放9位数字。

例如:

2156897546

用压缩9方法存储,其数据结构为:

156897546 21

三种方式归根结底都是进制的转换问题:普通不压缩法相当于十进制,四位压缩法相当于一万进制,九位压缩法相当于十亿进制。

三种方法的时间效率不同:假设两个数进行四则运算。运用普通法存储拥有最多的单位,其次是四位压缩法,最少是九位压缩法。进行加法运算时,两个数组中,以其中一个数组为起点,使其各个单元与另一个数组的各个单元进行相加运算。其时间复杂度为O(n^2)级。因此压缩9位存储法开辟的单元少,所以消耗的时间最少。

在此我们仅此介绍四位压缩法的构造以及乘法与加法计算样例(有可能的话,以后会补齐其他的四则运算=_=)

int StrToNum(const char str[], int num[])//从字符串的最后一位倒序向,int数组正序方向赋值(int数组是倒序的大数)
{int len=strlen(str),i,j=0;for(i=len-1;i>2;i-=4)//倒序每4个数字存放一个单位内{if(i-3>=0)num[j++]=(str[i-3]-'0')*1000+(str[i-2]-'0')*100+(str[i-1]-'0')*10+(str[i]-'0');}if(i==0)//如果剩余1个数字num[j++]=str[0]-'0';else if(i==1)//剩余2个数字num[j++]=(str[0]-'0')*10+(str[1]-'0');else if(i==2)//剩余3个数字num[j++]=(str[0]-'0')*100+(str[1]-'0')*10+(str[2]-'0');while(j>0&&num[j-1]==0) //j返回num的长度j--;return j;
}
int Add(int num1[],int num2[],int num3[],int len1,int len2,int& num3_begin)//加法  num1,num2是原始数据的数组,num3用来存放结果
{int i=0,j=len1>len2?len1:len2;            //len1,len2分别代表数组num1,num2的长度,num3_begin返回结果中数值开始的下标。if(len1==0&&len2==0)      //原始数据是0的情况讨论。  0:num1、num2都是0;   1:num1是0    2:num2是0return 0;else if(len1==0)return 1;else if(len2==0)return 2;else{while(i<j) //循环次数是取len1,和len2中最大的数{num3[i]+=num1[i]+num2[i];//相加if(num3[i]>=10000)      //若数值大于进制进行进位操作num3[i+1]+=num3[i]/10000,num3[i]%=10000;i++;}if(num3[i]==0)//返回结果中数值开始的下标num3_begin=i-1;elsenum3_begin=i;} return -1;
}
int Multiply(int num1[], int num2[], int num3[], int len1, int len2,int &num3_begin)//乘法    存储在num1,num2中的数是从下标0开始倒序存放的。
{int i=0,j=0,k=0;if(len1==0||len2==0)        //num1、num2有一方是0return 0;else{while(i<len1){k=i;j=0;while(j<len2){num3[k]+=num1[i]*num2[j];       //本位原来可能有数字,所以用+=if(num3[k]>=10000)num3[k+1]+=num3[k]/10000,num3[k]%=10000;k++,j++;}i++;}}if(num3[k]!=0)        //返回数中最高位不为0的下标num3_begin=k;elsenum3_begin=k-1;return 1;
}

高精度4位压缩法原理与实现相关推荐

  1. 7的整除特征 三位一截_整除的特征、三位截断法的原理

    对于数的整除特征大家都比较熟悉:比如4看后两位(因为100是4的倍数),8看后三位(因为1000是8的倍数),5末尾是0或5,3与9看各位数字和等等,今天重点研究一下3,9,7,11,13的整除特征( ...

  2. 火车进出栈问题(高精度+压位+质因数分解消除除法)

    题目描述 一列火车n节车厢,依次编号为1,2,3,-,n. 每节车厢有两种运动方式,进栈与出栈,问n节车厢出栈的可能排列方式有多少种. 输入格式 输入一个整数n,代表火车的车厢数. 输出格式 输出一个 ...

  3. CRC16查表法原理

    Preface CRC(Cyclic Redundancy Check)是数字通信系统中广泛使用的差错检测技术,本文将探究使用广泛的CRC查表法的原理实现细节,也作为一次学习记录总结. 一.CRC校验 ...

  4. N皇后问题 - 构造法原理与证明: 时间复杂度O(1)

    M皇后问题 - 构造法原理 *[原] E.J.Hoffman; J.C.Loessi; R.C.Moore* *The Johns Hopkins University Applied Physics ...

  5. ZIP/RAR压缩包加密原理和解密方法

    ZIP/RAR压缩包加密原理和解密方法 1.压缩包的概念 一般我们看到的压缩格式有.rar,.zip,等等有许多格式但主要压缩的作用就是让某一个文件占用空间小点.比如原来是50MB,可以压缩到30多M ...

  6. python解析原理_主成分分析法原理及其python实现

    主成分分析法原理及其python实现 前言: 这片文章主要参考了Andrew Ng的Machine Learning课程讲义,我进行了翻译,并配上了一个python演示demo加深理解. 本文主要介绍 ...

  7. 本周AI热点回顾:GAN压缩法使算力消耗不到1/9,开源生成器让你的照片秒变手绘日漫

    01 这个开源动漫生成器让你的照片秒变手绘日漫 尽管最近 2019 年的图灵奖颁给了计算机图形学.颁给了皮克斯 3D 动画,但很多人可能认为二维动漫更有意思一些.像宫崎骏.新海诚这些大师手绘下的动漫, ...

  8. HDU 1429 胜利大逃亡(续) (BFS+位压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

  9. java加密解密代码_base64位加密解密原理及js代码实现

    base64位加密解密原理及js代码实现 在网上找了很多关于Base64加密解密的原理以一个比较通俗易懂的方式理解整理了一下大致原理如下 先上base64对照表 #加密 #1:将明文对照以acsii码 ...

最新文章

  1. 科大讯飞年报出炉,2018每天赚148万元,53%是政府补助
  2. linux centos tcpreplay 重放数据
  3. haslayout详解
  4. docker安装配置分布式elasticsearch、kibana、head、cerebro
  5. Nacos源码BeatTask
  6. 葡萄城报表V11 SP2新版本震撼发布!
  7. mysql 字符串函数大全_mysql 字符串函数大全
  8. c扩展php 对象,PHP扩展开发之面向对象
  9. OpenShift - 部署基于MongoDB和NodeJS的多层应用
  10. express日常开发总结
  11. DB2获取CHAR字段数据的数据长度方法
  12. windows图片查看器背景颜色更改
  13. 计算机随机抽样的方法有,卫生统计学四种随机抽样方法
  14. php laravel 开发工具,Laravel 文档工具
  15. 程序员必备开发工具(IDE)推荐
  16. java物流管理系统_基于java的物流管理系统
  17. GitHub上最励志的计算机自学教程(重制版)
  18. Angular文件创建命令
  19. ubuntu护眼第二大神器 Redshift
  20. 芯片破壁者(四):兵戈未息的DRAM战场

热门文章

  1. Oracle 业务表自制审计字段使用
  2. 【BOOST C++ 10 时间数据】(4)时间格式输入和输出(11-12)
  3. 你知道IPC二级和IPC三级有什么区别吗?两者对PCB产品的影响又是什么呢?
  4. “开心网”上出现网络中奖诈骗,提醒网友提防骗局
  5. 微信群营销方式微信群建群营销案例
  6. 如何用PHP调用学小易题库,如何使用 PHP 输出 hello world?()
  7. 22考研上岸西电计科初试395分经验分享
  8. No subdirectories found for mandatory directory location ‘file: /config/*/‘
  9. IIC串行通信总线介绍
  10. 不定期读一篇Paper之SENet