1、高精度加法
#include
#include
#include
using namespace std;
int main()
{
char a1[100],b1[100];
int a[100],b[100],c[100],lena,lenb,lenc,i,x;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
gets(a1);
gets(b1);
lena=strlen(a1);
lenb=strlen(b1);
for(i=0;i<=lena-1;i++) a[lena-i]=a1[i]-48;
for(i=0;i<=lenb-1;i++) b[lenb-i]=b1[i]-48;
lenc=1;
x=0;
while(lenc<=lena||lenc<=lenb)
{
c[lenc]=a[lenc]+b[lenc]+x;
x=c[lenc]/10;
c[lenc]%=10;
lenc++;
}
c[lenc]=x;
if(c[lenc]==0) lenc--;
for(i=lenc;i>=1;i--) cout< cout< return 0; } 2、高精度减法 #include #include #include using namespace std; int main() { char a1[1000],b1[1000],n[1000]; int a[1000],b[1000],c[1000],la,lb,lc,i,x; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); cin>>a1>>b1; if(strlen(a1) strcpy(n,a1); strcpy(a1,b1); strcpy(b1,n); cout<<"-"; } la=strlen(a1); lb=strlen(b1); for(i=0;i<=la-1;i++) a[la-i]=a1[i]-48; for(i=0;i<=lb-1;i++) b[lb-i]=b1[i]-48; lc=1;i=1;x=0; while(i<=la||i<=lb) { if(a[i] { a[i]+=10; a[i+1]--; } c[i]=a[i]-b[i]; i++; } lc=i; while((c[lc]==0)&&(lc>1)) lc--; for(i=lc;i>=1;i--) cout< cout< return 0; } 3、高精度乘法1 #include #include #include using namespace std; int main() { char a1[256],b1[256]; int a[256],b[256],c[256],lena,lenb,lenc,i,j,x; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); gets(a1); gets(b1); lena=strlen(a1); lenb=strlen(b1); for(i=0;i<=lena-1;i++) a[lena-i]=a1[i]-48; for(i=0;i<=lenb-1;i++) b[lenb-i]=b1[i]-48; lenc=1; i=1; x=0; for(i=1;i<=lena;i++) { x=0; for(j=1;j<=lenb;j++) { c[i+j-1]=a[i]*b[j]+x+c[i+j-1]; x=c[i+j-1]/10; c[i+j-1]%=10; } c[i+lenb]=x; } lenc=lena+lenb; while(c[lenc]==0&&lenc>1) lenc--; for(i=lenc;i>=1;i--) cout< cout< return 0; } 4、高精度除法 #include #include #include #include #include #include using namespace std; int main() { char a1[100],c1[100]; int a[100],c[100],lena,i,x=0,lenc,b; memset(a,0,sizeof(a)); memset(c,0,sizeof(c)); gets(a1); cin>>b; lena=strlen(a1); for(i=0;i<=lena-1;i++) a[i+1]=a1[i]-48; for(i=1;i<=lena;i++) { c[i]=(x*10+a[i])/b; x=(x*10+a[i])%b; } lenc=1; while(c[lenc]==0&&lenc for(i=lenc;i<=lena;i++) cout< return 0; } 5、高精度除法 #include #include #define N 500 using namespace std; int bj(int a[], int b[], int k1, int k2) /*比较大小函数*/ { int i, t, flag; /*flag作标志位*/ if(k1 < k2) flag = 0; /*被除数小于除数返回0*/ else if(k1 > k2) flag = 1; /*被除数大于除数返回1*/ else { /*被除数和除数位数相等则逐位进行比较*/ i = k1; t = 0; while(t == 0 && i > 0) { if(a[i] > b[i]) {t = 1; flag = 1;} else if(a[i] == b[i]) i--; else {t = 1; flag = 0;} } if(i == 0 && t == 0) flag = 2; /*被除数等于除数返回2*/ } return flag; } int jf(int a[], int b[], int k1, int k2) /*减法运算*/ { int i, k, d[N]; for(i = 0; i < k2; i++) d[i] = b[i]; /*把除数赋给数组d*/ for(i = k2; i < N; i++) d[i] = 0; /*d数组无数据的高位置0*/ k = k1 - k2 - 1; /*计算减法起始位置*/ if(k < 0) k = 0; if(k > 0) { for(i = k2 - 1; i >= 0; i--) d[i + k] = d[i]; /*移动减数位数与被减数对齐*/ for(i = 0; i < k; i++) d[i] = 0; /*移动后的其余位置0*/ } for(i = 0; i < k1; i++) { if(a[i] >= d[i]) a[i] -= d[i]; else { a[i + 1] = a[i + 1] - 1; a[i] = 10 + a[i] - d[i]; } } return k; } int main() { int a[N] = {0}, b[N] = {0}, c[N] = {0}, d[N] = {0}; int i, ka, kb, m, t, t1, t2, k, x, kd, kk; char a1[N], b1[N]; printf("Input 被除数:"); scanf("%s", a1); ka=strlen(a1); for(i = 0; i < ka; i++) a[i] = a1[ka - i -1] - '0'; printf("Input 除数:"); scanf("%s", b1); kb = strlen(b1); for(i = 0; i < kb; i++) b[i] = b1[kb - i -1] - '0'; kd = ka; /*保存被除数位数*/ t2 = bj(a, b, ka, kb); m = 0; do { while(a[ka - 1] == 0) ka--; t = bj(a, b, ka, kb); if(t >= 1) { k = jf(a, b, ka, kb); c[k]++; if(k > m) m = k; t1 = 0; for(i = k; i <= m; i++) { x = c[i] + t1; c[i] = x % 10; t1 = x / 10; } if(t1 > 0) {m++; c[m] = t1; } } }while(t == 1); if(t2 == 0) { printf("商=0"); printf("\n余数="); for(i = kd - 1; i >= 0; i--) printf("%d", a[i]); return(1); } if(t2 == 2) { printf("商= 1"); printf("\n余数= 0"); return(1); } kk = kd; while(!c[kd - 1]) kd--; printf("商= "); for(i = kd - 1; i >= 0; i--) printf("%d", c[i]); while(!a[kk]) kk--; printf("\n余数= "); if(kk < 0) { printf("0"); return(1); } for(i = kk; i >= 0; i--) printf("%d", a[i]); } 6、数楼梯 题目描述Description 楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶。编一个程序,计算共有多少种不同的走法。 输入输出格式Input/output 输入格式: 一个数字,楼梯数。 输出格式: 走的方式几种。 高精度计算 由于计算机具有运算速度快,计算精度高的特点,许多过去由人来完成的烦琐、复杂的数学计算,现在都可以由计算机来代替。 计算机计算结果的精度,通常要受到计算机硬件环境的限制。例如,pascal 要计算的数字超过19位,计算机将按浮点形式输出;另一方面,计算机又有数的表示范围的限制,在一般的微型计算机上,实数的表示范围为l0-38 -l038。例如,在计算N!时,当N=21时计算结果就超过了这个范围,无法计算了。这是由计算机的硬件性质决定的,但是,我们可以通过程序设计的方法进行高精度计算(多位数计算)。 学习重点 1、掌握高精度加、减、乘、除法。 3、理解高精度除法运算中被除数、除数、商和余数之间的关系。 4、能编写相应的程序,解决生活中高精度问题。 学习过程 一、高精度计算的基本方法 用free pascal程序进行高精度计算,首先要处理好以下几个基本问题:【数据的输入与保存】 (1)一般采用字符串变量存储数据,然后用length函数测量字符串长度确定其位数。 (2)分离各位数位上的数字 分离各数位上的数通常采用正向存储的方法。以“163848192”为例,见下表:A[9] A[8] A[7] A[6] A[5] A[4] A[3] A[2] A[1] 1 6 3 8 4 8 1 9 2 基本原理是A[1]存放个位上的数字,A[2]存放十位上的数字,……依此类推。即下标小的元素存低位上的数字,下标大的元素存高位上的数字,这叫“下标与位权一致”原则。 【计算结果位数的确定】 (1)高精度加法:和的位数为两个加数中较大数的位数+1。 (2)高精度减法:差的位数为被减数和减数中较大数的位数。 (3)高精度乘法:积的位数为两个相乘的数的位数之和。 (4)高精度除法:商的位数按题目的要求确定。 【计算顺序与结果的输出】 高精度加、减、乘法,都是从低位到高位算起,而除法相反。输出结果都是从高位到低位的顺序,注意:高位上的零不输出(整数部分是零除外)。 高精度加法 【参考程序】 var a,b:array[1..10000] of byte; i,w,la,lb:integer; 图论算法及其MATLAB 程序代码 求赋权图G =(V ,E ,F )中任意两点间的最短路的Warshall-Floyd 算法: 设A =(a ij )n ×n 为赋权图G =(V ,E ,F )的矩阵,当v i v j ∈E 时a ij =F (v i v j ),否则取a ii =0,a ij =+∞(i ≠j ),d ij 表示从v i 到v j 点的距离,r ij 表示从v i 到v j 点的最短路中一个点的编号. ①赋初值.对所有i ,j ,d ij =a ij ,r ij =j .k =1.转向② ②更新d ij ,r ij .对所有i ,j ,若d ik +d k j <d ij ,则令d ij =d ik +d k j ,r ij =k ,转向③. ③终止判断.若d ii <0,则存在一条含有顶点v i 的负回路,终止;或者k =n 终止;否则令k =k +1,转向②. 最短路线可由r ij 得到. 例1求图6-4中任意两点间的最短路. 解:用Warshall-Floyd 算法,MATLAB 程序代码如下: n=8;A=[0281Inf Inf Inf Inf 206Inf 1Inf Inf Inf 8607512Inf 1Inf 70Inf Inf 9Inf Inf 15Inf 03Inf 8 Inf Inf 1Inf 3046 Inf Inf 29Inf 403 Inf Inf Inf Inf 8630];%MATLAB 中,Inf 表示∞ D=A;%赋初值 for (i=1:n)for (j=1:n)R(i,j)=j;end ;end %赋路径初值 for (k=1:n)for (i=1:n)for (j=1:n)if (D(i,k)+D(k,j) 关于圆周率的计算 祖冲之在数学方面的突出贡献是关于圆周率的计算,确定了相当精确的圆周率值。中国古代最初采用的圆周率是“周三径一”,也就是说,π=3。这个数值与当时文化发达的其他国家所用的圆周率相同。但这个数值非常粗疏,用它计算会造成很大的误差。随着生产和科学的发展,π=3 就越来越不能满足精确计算的要求。因此,中外数学家都开始探索圆周率的算法和推求比较精确的圆周率值。在中国,据公元一世纪初制造的新莽嘉量斛(亦称律嘉量斛,王莽铜斛,是一种圆柱形标准量器,现存)推算,它所取的圆周率是3.1547 。二世纪初,东汉天文学家张衡在《灵宪》中取用π=≈3.1466,又在球体积计算中取用π≈3.1622。三国时东吴天文学家王蕃在浑仪论说中取用π≈3.1556。以上这些圆周率近似值,比起古率“周三径一”,精确度有所提高,其中π= 10还是世界上最早的记录。但这些数值大多是经验结果,并没有可靠的理论依据。 在这方面最先取得突破性进展的是魏晋之际的数学家刘徽,他在《九章算术注》中创立了“割圆术”,为计算圆周率建立起相当严密的理论和完善的算法。他所得到的圆周率值π=3.14 与π==3.1416,都很精确,在当时世界上是很先进的,至今仍在经常使用。继刘徽之后,祖冲之则将圆周率推算到更加精确的程度。据《隋书·律历志》记载,祖冲之确定了π的不足近似值 3.1415926 和过剩近似值 3.1415927,π的真值在这两个近似值之间,即 3.1415926<π<3.1415927 精确到小数 7 位。这是当时世界上最先进的数学成果,直到约一千年后,才为 15 世纪中亚数学家阿尔·卡西(Al—? kash1)和16世纪法国数学家韦达(F.Vièta,1540—1603)所超过。 关于他得到这两个数值的方法,史无明载,一般认为是基于刘徽割圆术。通过现代计算验证,如果按照割圆术计算,要得到小数 7 位准确的圆周率值,必须求出圆内接正12288 边形的边长和 24576边形的面积,这样,就要对9位数进行上百次加减乘除和开方运算,还要选择适当的有效数字,保证准确的误差范围。对于用算筹计算的古代数学家来说,这绝不是一件轻而易举的事情,只有掌握纯熟的理论和技巧,并具备踏踏实实和一丝不苟的研究精神,才能取得这样的杰出成就。祖冲之的这项记录在中国也保持了一千多年。 中国古代数学家和天文学家还往往用分数表示常量的近似值。为此,祖冲之确定了π的两个分数形式的近似值:约率π=22/7≈3.14 ,密率π=355/113 ≈3.1415929。这两个数值都是π的渐近分数。刘宋天文学家何承天及古希腊阿基米德等都已用到过。密率355/113 是π的分母小于10000的最佳近似分数,则为祖冲之首创。关于密率355/113是如何得到的,今人有“调日法”术,连分数法,解同余式或不定方程,割圆术等种种推测,迄今尚无定论。在欧洲,π= 355/113 是16世纪由德国数学家奥托(V.Otto,1550(?)—1605)和荷兰工程师安托尼兹(A.Anthonisz,1527—1607)分别得到,后通称“安托尼兹率”,但这已是祖冲之以后一千多年的事情了。自从我国古代灿烂的科学文化逐渐得到世界公认以来,一些学者就建议把π= 355 称为“祖率”,以纪念祖冲之的杰出贡献。 关于球的体积公式及其证明: 祖冲之的另一项重要数学成就是关于球的体积公式及其证明。各种几何体的体积计算是古代几何学中的基本内容。《九章算术》商功章已经正确地解决了 《计算机算法设计与分析》习题及答案 一.选择题 1、二分搜索算法是利用(A )实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 2、下列不是动态规划算法基本步骤的是(A )。 A、找出最优解的性质 B、构造最优解 C、算出最优解 D、定义最优解 3、最大效益优先是( A )的一搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 4. 回溯法解旅行售货员问题时的解空间树是( A )。 A、子集树 B、排列树 C、深度优先生成树 D、广度优先生成树 5.下列算法中通常以自底向上的方式求解最优解的是( B )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 6、衡量一个算法好坏的标准是(C )。 A 运行速度快 B 占用空间少 C 时间复杂度低 D 代码短 7、以下不可以使用分治法求解的是(D )。 A 棋盘覆盖问题 B 选择问题 C 归并排序 D 0/1背包问题 8. 实现循环赛日程表利用的算法是( A )。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 9.下面不是分支界限法搜索方式的是( D )。 A、广度优先 B、最小耗费优先 C、最大效益优先 D、深度优先 10.下列算法中通常以深度优先方式系统搜索问题解的是( D )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 11.备忘录方法是那种算法的变形。(B ) A、分治法 B、动态规划法 C、贪心法 D、回溯法 12.哈夫曼编码的贪心算法所需的计算时间为( B )。 A、O(n2n) B、O(nlogn) C、O(2n) D、O(n) 13.分支限界法解最大团问题时,活结点表的组织形式是( B )。 A、最小堆 B、最大堆 C、栈 D、数组 14.最长公共子序列算法利用的算法是( B )。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 15.实现棋盘覆盖算法利用的算法是( A )。 A、分治法 B、动态规划法 C、贪心法 D、回溯法 16.下面是贪心算法的基本要素的是( C )。 A、重叠子问题 B、构造最优解 C、贪心选择性质 D、定义最优解 17.回溯法的效率不依赖于下列哪些因素( D ) A.满足显约束的值的个数 B. 计算约束函数的时间 C.计算限界函数的时间 D. 确定解空间的时间 18.下面哪种函数是回溯法中为避免无效搜索采取的策略( B ) A.递归函数 B.剪枝函数C。随机数函数 D.搜索函数 19. ( D )是贪心算法与动态规划算法的共同点。高精度计算
图论算法及其MATLAB程序代码
关于圆周率的计算
计算机算法设计与分析习题和答案解析
高精度数计算