版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1超大数的四则运算超大数的四则运算2各类型的范围各类型的范围vint (16位)位) -3276832767(注:现在大多数的编译器的(注:现在大多数的编译器的int型是型是32位的位的 也就也就是说跟是说跟long型的大小一样)型的大小一样)vlong long或或_int64(64位)位) -92233720368547758089223372036854775807vfloat(32位)位) 精确到小数点后精确到小数点后67位位 vdouble (64位)位) 精确到小数点后精确到小数点后1516位位(注:平时做题时(注:平时做题时 都把浮点型数据定义为都把浮点型数据定义为double型
2、型 避免精度不够出错)避免精度不够出错)3请计算:请计算:1 1、 2 2 的的 10001000次幂次幂2 2、 2 2 的的 1000010000次幂次幂3 3、 1234567890123456789123456789034123456789012345678912345678903453434534534535345434543 53434534534535345434543 乘上乘上938742938749287349287340280348293874293874928734928734028034820938479288374892733453453534093847928837
3、48927334534535344主要内容主要内容数字存储的实现数字存储的实现1加法运算的实现加法运算的实现 2减法运算的实现减法运算的实现 3乘法运算的实现乘法运算的实现 4除法运算的实现除法运算的实现 5幂运算的实现幂运算的实现65数字存储的实现数字存储的实现v大数计算的因数和结果精度一般是少则数大数计算的因数和结果精度一般是少则数十位,多则几万位。在十位,多则几万位。在C/C+C/C+语言中定义语言中定义的类型中精度最多只有二十多位。的类型中精度最多只有二十多位。一般我一般我们称这种基本数据类型无法表示的整数为们称这种基本数据类型无法表示的整数为大整数。如何表示和存放大整数呢?基本大整数
4、。如何表示和存放大整数呢?基本的思想就是:用数组存放和表示大整数。的思想就是:用数组存放和表示大整数。一个数组元素,存放大整数中的一位。一个数组元素,存放大整数中的一位。比如:比如:166443431801234567891664434318下标下标6加法运算的实现加法运算的实现99876543201664434300加数加数被加数被加数+初始化进位为初始化进位为0 0,各对应,各对应位相加后再加上进位数位相加后再加上进位数1 1、进位为、进位为1 102 2、进位为、进位为1 163 3、进位为、进位为1 154 4、进位为、进位为1 12由低位向高位相加计算,直至所有运算结束由低位向高位相
5、加计算,直至所有运算结束7理中注意问题:理中注意问题: v判断最后数组的长度判断最后数组的长度.v去掉前导零去掉前导零8大数加法大数加法void Add(char s1,char s2)/参数为两个字符串数组参数为两个字符串数组 int num1M,num2M; int i,j; len1 = strlen (s1); len2 = strlen (s2); for (i = len1-1,j = 0; i = 0; i -)/num10保存的是低位保存的是低位 num1j+ = s1i - 0; for (i = len2-1,j = 0; i = 0; i -) num2j+ = s2i
6、- 0; for (i = 0; i 9) num1i -= 10; num1i+1 +; 9 for (i = M-1; (i = 0)&(num1i = 0); i -) ;/找到第一个不是找到第一个不是 0的数的位置的数的位置 if (i = 0) /从高位到低位输出每个数从高位到低位输出每个数 for (; i = 0; i -) printf (%d,num1i); else printf (0n);10减法运算的实现减法运算的实现 v算法也是从低位开始减。先要判断减数和被减算法也是从低位开始减。先要判断减数和被减数那一个位数长,减数位数长是正常减;被减数那一个位数长,减数位数长是正
7、常减;被减数位数长,则被减数减减数,最后还要加上负数位数长,则被减数减减数,最后还要加上负号;两数位数长度相等时,最好比那一个数字号;两数位数长度相等时,最好比那一个数字大,否则负号处理会很繁琐;处理每一项时要大,否则负号处理会很繁琐;处理每一项时要,如果前一位相减有借位,就先减去上一位的,如果前一位相减有借位,就先减去上一位的借位,无则不减,再去判断是否能够减开被减借位,无则不减,再去判断是否能够减开被减数,如果减不开,就要借位后再去减,同时置数,如果减不开,就要借位后再去减,同时置借位为借位为1 1,否则置借位为,否则置借位为0 0。11减法运算的实现减法运算的实现768765432089
8、75434320减数减数被减数被减数-初始化借位为初始化借位为0 0,各对应,各对应位相减后再减上借位数位相减后再减上借位数1 1、借位为、借位为1 192 2、借位为、借位为1 163 3、借位为、借位为0 004 4、借位为、借位为0 02由低位向高位相加计算,直至所有运算结束由低位向高位相加计算,直至所有运算结束12处理中注意问题:处理中注意问题: 1如果被减数大于减数时如果被减数大于减数时,交换两个数再相减,交换两个数再相减,最后加个最后加个“-”号即可号即可2结果可能会出现前面是结果可能会出现前面是一堆一堆0的情况,要处理好的情况,要处理好,如当减数为,如当减数为112,而被,而被减
9、数为减数为111时,会出现时,会出现001 13乘法运算的实现乘法运算的实现 v首先说一下乘法计算的算法,从低位向高首先说一下乘法计算的算法,从低位向高位乘,在竖式计算中,我们是将乘数第一位乘,在竖式计算中,我们是将乘数第一位与被乘数的每一位相乘,记录结果,之位与被乘数的每一位相乘,记录结果,之后,用第二位相乘,记录结果并且左移一后,用第二位相乘,记录结果并且左移一位,以此类推,直到计算完最后一位,再位,以此类推,直到计算完最后一位,再将各项结果相加。得出最后结果。将各项结果相加。得出最后结果。v计算的过程基本上和小学生列竖式做乘法相同。计算的过程基本上和小学生列竖式做乘法相同。为编程方便,并
10、不急于处理进位,而将进位问题为编程方便,并不急于处理进位,而将进位问题留待最后统一处理。留待最后统一处理。vansi+j = aiansi+j = ai* *bj; bj; 14现以 83549 为例来说明程序的计算过。v先算8359。59 得到45 个1,39 得到27 个10,89 得到72 个100。由于不急于处理进位,所以8359 算完后,aResult 如下:v接下来算45。此处45 的结果代表20 个10,因此要 aResult1+=20,变为:15v再下来算43。此处43 的结果代表12 个100,因此要 aResult2+= 12,变为:v最后算 48。此处48 的结果代表 3
11、2 个1000,因此要 aResult3+= 32,变为:16v乘法过程完毕。接下来从 aResult0开始向高位逐位处理进位问题。aResult0留下5,把4 加到aResult1上,aResult1变为51 后,应留下1,把5 加到aResult2上最终使得aResult 里的每个元素都是1 位数,结果就算出来了:17v总结一个规律总结一个规律:即一个数的第即一个数的第i 位和另一个数的第位和另一个数的第j 位相乘所得的数,一定是要累加到结果的第位相乘所得的数,一定是要累加到结果的第i+j 位上。这里位上。这里i, j 都是从右往左,从都是从右往左,从0 开始数。开始数。vansi+j =
12、 aiansi+j = ai* *bj; bj; 18处理中注意问题:处理中注意问题: 1另外进位时要处理,当前的值加另外进位时要处理,当前的值加上进位的值再看本位数字是否又上进位的值再看本位数字是否又有进位;前导清零。有进位;前导清零。19大数乘法大数乘法void Multi(char str1,char str2) int len1,len2,i,j; int aMAX+10,bMAX+10,cMAX*2+10; memset (a,0,sizeof(a); memset (b,0,sizeof(b); memset (c,0,sizeof(c); len1=strlen(str1); f
13、or(j=0,i=len1-1; i=0; i-)/把数字倒过来把数字倒过来 aj+=str1i-0; len2=strlen(str2); for(j=0,i=len2-1; i=0; i-)/倒转第二个整数倒转第二个整数 bj+=str2i-0; for(i=0; ilen2; i+)/用第二个数乘以第一个数用第二个数乘以第一个数,每次一位每次一位 for(j=0; jlen1; j+) ci+j+= bi*aj; /先乘起来先乘起来,后面统一进位后面统一进位 20for(i=0; i=10) ci+1+=ci/10; ci%=10; for(i=MAX*2; (ci=0)&(i=0);
14、i-);/跳过高位的跳过高位的0 if(i=0) for(; i=0; i-) printf(%d, ci); else printf(0); pritnf(n);21除法运算的实现除法运算的实现v首先说一下我们所要的结果,当除数除首先说一下我们所要的结果,当除数除不开被子除数时,不用除到小数,当除不开被子除数时,不用除到小数,当除数小于被除数时,除数作为余数既可,数小于被除数时,除数作为余数既可,不用再向下除了。不用再向下除了。22基本思路基本思路v基本的思想是反复做减法,看看从被除数里最多基本的思想是反复做减法,看看从被除数里最多能减去多少个除数,商就是多少。一个一个减显能减去多少个除数,商就是多少。一个一个减显然太慢,如何减得更快一些呢?以然太慢,如何减得更快一些呢?以7546 除以除以23 为例来看一下:开始商为为例来看一下:开始商为0。先减去。先减去23 的的100 倍,就是倍,就是2300,发现够减,发现够减3 次,余下次,余下646。于是商的值就增加。于是商的值就增加300。然后用。然后用646减去减去230,发现够减,发现
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- AI在健身营养搭配中的应用
- 集成电路研发实验室改造建设方案
- 工业基础机器装调 1
- 黑龙江省哈尔滨市第三中学2025-2026学年度下学期高二学年期中考试 语文答案
- 高三英语复习计划方案
- 信息采集记录表
- 学校特异体质学生登记表
- 护理伦理与法律试题
- 护理不良事件信息共享
- 昏迷促醒护理的护理安全管理
- GB/T 44096-2024田径课程学生运动能力测评规范
- 知行合一 - 社会实践•创新创业智慧树知到期末考试答案2024年
- 医院培训课件:《急危重症的识别》
- 从“造物”到“谋事”-设计事理学课件
- 杜甫《登高》精美公开课优秀课件-图文
- JJF 1832-2020(1 mT~2.5 T)磁强计校准规范
- GB/T 25000.51-2016系统与软件工程系统与软件质量要求和评价(SQuaRE)第51部分:就绪可用软件产品(RUSP)的质量要求和测试细则
- GB/T 14406-2011通用门式起重机
- 大一《有机化学》题库Word版
- 【自学考试资料】2110考期古文史二全书笔记汇总
- 支气管哮喘内科学课件
评论
0/150
提交评论