欢迎来到天天文库
浏览记录
ID:44098626
大小:143.50 KB
页数:32页
时间:2019-10-18
《第七章 高精度计算》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第七章高精度计算7.1例题:大整数加法7.2例题:大整数乘法7.3例题:大整数除法7.4例题:麦森数大整数加法问题描述求两个不超过200位的非负整数的和。输入数据有两行,每行是一个不超过200位的非负整数,没有多余的前导0。输出要求一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342解题思路1)大整数以字符串方式输入2)用整型数组an来存放大整数用unsignedan1[201]保存第一个数,用unsignedan2[200]表示第二个数,an[0]存放个位数,an[1]存放十位数,an[2]存放百位数……数
2、字字符变数字的方式是减去字符’0’3)模拟小学生列竖式做加法,从个位开始逐位相加,超过或达到10则进位。相加的结果直接存放在an1中。要注意处理进位。大整数加法#include#include#defineMAX_LEN200intan1[MAX_LEN+10];intan2[MAX_LEN+10];charszLine1[MAX_LEN+10];charszLine2[MAX_LEN+10];intmain(){scanf("%s",szLine1);scanf("%s",szLine2);inti,j;me
3、mset(an1,0,sizeof(an1));memset(an2,0,sizeof(an2));intnLen1=strlen(szLine1);j=0;for(i=nLen1-1;i>=0;i--)an1[j++]=szLine1[i]-'0';intnLen2=strlen(szLine2);j=0;for(i=nLen2-1;i>=0;i--)an2[j++]=szLine2[i]-'0';大整数加法intan1[MAX_LEN+10]={0};intan2[MAX_LEN+10]={0};大整数加法for(i=0;i4、++){an1[i]+=an2[i];if(an1[i]>=10){an1[i]-=10;an1[i+1]++;}}boolbStartOutput=false;//用于跳过多余的0for(i=MAX_LEN;i>=0;i--){if(bStartOutput)printf("%d",an1[i]);elseif(an1[i]){printf("%d",an1[i]);bStartOutput=true;}}return0;}大整数乘法问题描述求两个不超过200位的非负整数的积。输入数据有两行,每行是一个不超过200位的非负整数,没有多余的前导0。5、输出要求一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。解题思路用unsignedan1[200]和unsignedan2[200]分别存放两个乘数,用aResult[400]来存放积。计算的中间结果存在aResult中。aResult长度取400是因为两个200位的数相乘,积最多有400位。an1[0],an2[0],aResult[0]都表示个位。一个数的第i位和另一个数的第j位相乘所得的数,是累加到结果的第i+j位上。这里i,j都是从右往左,从0开始数。计算的过程基本上和小学生列竖式做乘法相同。为6、编程方便,并不急于处理进位,而将进位问题留待最后统一处理。大整数乘法现以835×49为例来说明程序的计算过程。先算835×9。5×9得到45个1,3×9得到27个10,8×9得到72个100。不急于处理进位,835×9算完后,aResult如下:接下来算4×5。此处4×5的结果代表20个10,因此要aResult[1]+=20,变为:再接下来算4×3。此处4×3的结果代表12个100,因此要aResult[2]+=12,变为:最后算4×8。此处4×8的结果代表32个1000,因此要aResult[3]+=32,变为:乘法过程完毕。接下来从aResu7、lt[0]开始向高位逐位处理进位问题。aResult[0]留下5,把4加到aResult[1]上,aResult[1]变为51后,应留下1,把5加到aResult[2]上……最终使得aResult里的每个元素都是1位数,结果为40915。#include#include#defineMAX_LEN200unsignedan1[MAX_LEN+10];unsignedan2[MAX_LEN+10];unsignedaResult[MAX_LEN*2+10];charszLine1[MAX_LEN+10];char8、szLine2[MAX_LEN+10];intmain(){gets(szLine1);gets(szLine2);int
4、++){an1[i]+=an2[i];if(an1[i]>=10){an1[i]-=10;an1[i+1]++;}}boolbStartOutput=false;//用于跳过多余的0for(i=MAX_LEN;i>=0;i--){if(bStartOutput)printf("%d",an1[i]);elseif(an1[i]){printf("%d",an1[i]);bStartOutput=true;}}return0;}大整数乘法问题描述求两个不超过200位的非负整数的积。输入数据有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
5、输出要求一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。解题思路用unsignedan1[200]和unsignedan2[200]分别存放两个乘数,用aResult[400]来存放积。计算的中间结果存在aResult中。aResult长度取400是因为两个200位的数相乘,积最多有400位。an1[0],an2[0],aResult[0]都表示个位。一个数的第i位和另一个数的第j位相乘所得的数,是累加到结果的第i+j位上。这里i,j都是从右往左,从0开始数。计算的过程基本上和小学生列竖式做乘法相同。为
6、编程方便,并不急于处理进位,而将进位问题留待最后统一处理。大整数乘法现以835×49为例来说明程序的计算过程。先算835×9。5×9得到45个1,3×9得到27个10,8×9得到72个100。不急于处理进位,835×9算完后,aResult如下:接下来算4×5。此处4×5的结果代表20个10,因此要aResult[1]+=20,变为:再接下来算4×3。此处4×3的结果代表12个100,因此要aResult[2]+=12,变为:最后算4×8。此处4×8的结果代表32个1000,因此要aResult[3]+=32,变为:乘法过程完毕。接下来从aResu
7、lt[0]开始向高位逐位处理进位问题。aResult[0]留下5,把4加到aResult[1]上,aResult[1]变为51后,应留下1,把5加到aResult[2]上……最终使得aResult里的每个元素都是1位数,结果为40915。#include#include#defineMAX_LEN200unsignedan1[MAX_LEN+10];unsignedan2[MAX_LEN+10];unsignedaResult[MAX_LEN*2+10];charszLine1[MAX_LEN+10];char
8、szLine2[MAX_LEN+10];intmain(){gets(szLine1);gets(szLine2);int
此文档下载收益归作者所有