当前位置:文档之家› 高精度算法详解(C++版)

高精度算法详解(C++版)

高精度算法详解(C++版)
高精度算法详解(C++版)

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程序代码

图论算法及其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 )是贪心算法与动态规划算法的共同点。

高精度数计算

C语言课程设计-高精度数计算 源代码: #include #include #include int main() { int a,b; int c; int i; int *Numa,*Numb,*Sum; printf("请输入第一个加数的位数(小于1000位),加数由系统随机生成:"); scanf("%d",&a); printf("请输入第二个加数的位数(小于1000位),加数由系统随机生成:"); scanf("%d",&b); Numa=(int *)malloc(a*sizeof(int)); Numb=(int *)malloc(b*sizeof(int)); srand( (unsigned)time( NULL ) );//产生随机种子 //随机产生加数a for(i=0;i

{ printf("%d",Numa[i]); } printf("\n"); printf("随机产生的加数b为:\n"); for(i=0;i=b)//加数a大 { c=a; Sum=(int *)malloc((c+1)*sizeof(int)); tag=0; for(i=0;i=10)//如果和大于10 { Sum[c-i]=Sum[c-i]-10; tag=1;//标志进位 } else { tag=0; } } else//有进位 { Sum[c-i]=Numa[a-i-1]+Numb[b-i-1]+1; if(Sum[c-i]>=10)//如果和大于10 { Sum[c-i]=Sum[c-i]-10; tag=1;//标志进位 } else { tag=0; } }

常用数学公式

常用数学公式大全 1、每份数×份数=总数总数÷每份数=份数总数÷份数=每份数 2、1倍数×倍数=几倍数几倍数÷1倍数=倍数几倍数÷倍数=1倍数 3、速度×时间=路程路程÷速度=时间路程÷时间=速度 4、单价×数量=总价总价÷单价=数量总价÷数量=单价 5、工作效率×工作时间=工作总量工作总量÷工作效率=工作时间工作总量÷工作时间=工作效率 6、加数+加数=和和-一个加数=另一个加数 7、被减数-减数=差被减数-差=减数差+减数=被减数 8、因数×因数=积积÷一个因数=另一个因数 9、被除数÷除数=商被除数÷商=除数商×除数=被除数 小学数学图形计算公式 1、正方形C周长S面积a边长周长=边长×4C=4a面积=边长×边长S=a×a 2、正方体V:体积a:棱长表面积=棱长×棱长×6S表=a×a×6体积=棱长×棱长×棱长V=a×a×a 3、长方形 C周长S面积a边长 周长=(长+宽)×2C=2(a+b) 面积=长×宽S=ab 4、长方体 V:体积s:面积a:长b:宽h:高 (1)表面积(长×宽+长×高+宽×高)×2S=2(ab+ah+bh) (2)体积=长×宽×高V=abh 5三角形s面积a底h高 面积=底×高÷2s=ah÷2 三角形高=面积×2÷底 三角形底=面积×2÷高 6平行四边形 s面积a底h高 面积=底×高s=ah 7梯形 s面积a上底b下底h高 面积=(上底+下底)×高÷2s=(a+b)×h÷2 8圆形 S面积C周长∏d=直径r=半径 (1)周长=直径×∏=2×∏×半径C=∏d=2∏r (2)面积=半径×半径×∏ 9圆柱体 v:体积h:高s;底面积r:底面半径c:底面周长 (1)侧面积=底面周长×高 (2)表面积=侧面积+底面积×2 (3)体积=底面积×高 (4)体积=侧面积÷2×半径 10圆锥体 v:体积h:高s;底面积r:底面半径 体积=底面积×高÷3 总数÷总份数=平均数

圆周率计算公式

圆周率计算公式Revised on November 25, 2020

12 π= 22 π= 32 π= 42 π= 52 π= 62 π= 72 π= 82 π= 92 π= 102 π=314 112 π= 122 π= 132 π= 142 π= 152 π= 162 π= 172 π= 182 π= 192 π= 202 π=1256 212 π= 222 π= 232 π= 242 π= 252 π= 262 π= 272 π= 282 π= 292 π= 302 π=2826 312 π= 322 π= 332 π= 342 π= 352 π= 362 π= 372 π= 382 π= 392 π= 402 π=5024 412 π= 422 π= 432 π= 442 π=

452 π= 462 π= 472 π= 482 π= 492 π= 502 π=7850 512 π= 522 π= 532 π= 542 π= 552 π= 562 π= 572 π= 582 π= 592 π= 602 π=11304 612 π= 622 π= 632 π= 642 π= 652 π= 662 π= 672 π= 682 π= 692 π= 702 π=15386 712 π= 722 π= 732 π= 742 π= 752 π= 762 π= 772 π= 782 π= 792 π= 802 π= 812 π= 822 π= 832 π= 842 π= 852 π= 862 π= 872 π= 882 π=

892 π= 902 π=25434 912 π= 922 π= 932 π= 942 π= 952 π= 962 π= 972 π= 982 π= 992 π= 1002 π=31400 12~1002 12=1 22=4 32=9 42=16 52=25 62=36 72=49 82=64 92=81 102=100 112=121 122=144 132=169 142=196 152=225 162=256 172=289 182=324 192=361 202=400 212=441 222=484 232=529 242=576 252=625 262=676 272=729 282=784 292=841 302=900 312=961 322=1024 332=1089 342=1156 352=1225 362=1296 372=1396 382=1444 392=1521 402=1600 412=1681 422=1764 432=1849 442=1936 452=2025

贪心算法详解分析

贪心算法详解 贪心算法思想: 顾名思义,贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路经问题,最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。 贪心算法的基本要素: 1.贪心选择性质。所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。 动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。 对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。 2. 当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的 最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。 贪心算法的基本思路: 从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到算法中的某一步不能再继续前进时,算法停止。 该算法存在问题: 1. 不能保证求得的最后解是最佳的; 2. 不能用来求最大或最小解问题; 3. 只能求满足某些约束条件的可行解的范围。 实现该算法的过程: 从问题的某一初始解出发; while 能朝给定总目标前进一步do 求出可行解的一个解元素; 由所有解元素组合成问题的一个可行解; 用背包问题来介绍贪心算法: 背包问题:有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。要 求尽可能让装入背包中的物品总价值最大,但不能超过总容量。

圆周率的计算方法

圆周率的计算方法 古人计算圆周率,一般是用割圆法。即用圆的内接或外切正多边形来逼近圆的周长。Archimedes用正96边形得到圆周率小数点后3位的精度;刘徽用正3072边形得到5位精度;Ludolph Van Ceulen用正262边形得到了35位精度。这种基于几何的算法计算量大,速度慢,吃力不讨好。随着数学的发展,数学家们在进行数学研究时有意无意地发现了许多计算圆周率的公式。下面挑选一些经典的常用公式加以介绍。除了这些经典公式外,还有很多其他公式和由这些经典公式衍生出来的公式,就不一一列举了。 ?Machin公式 这个公式由英国天文学教授John Machin于1706年发现。他利用这个公式计算到了100位的圆周率。Machin公式每计算一项可以得到1.4位的十进制精度。因为它的计算过程中被乘数和被除数都不大于长整数,所以可以很容易地在计算机上编程实现。 Machin.c 源程序 还有很多类似于Machin公式的反正切公式。在所有这些公式中,Machin公式似乎是最快的了。虽然如此,如果要计算更多的位数,比如几千万位,Machin 公式就力不从心了。下面介绍的算法,在PC机上计算大约一天时间,就可以得到圆周率的过亿位的精度。这些算法用程序实现起来比较复杂。因为计算过程中涉及两个大数的乘除运算,要用FFT(Fast Fourier Transform)算法。FFT可以将两个大数的乘除运算时间由O(n2)缩短为O(nlog(n))。 关于FFT算法的具体实现和源程序,请参考Xavier Gourdon的主页 ?Ramanujan公式 1914年,印度数学家Srinivasa Ramanujan在他的论文里发表了一系列共14条圆周率的计算公式,这是其中之一。这个公式每计算一项可以得到8位的十进制精度。1985年Gosper用这个公式计算到了圆周率的17,500,000位。

高精度运算(C++)

万进制高精度运算(C++语言) 目前在青少年信息学奥林匹克竞赛中所涉及到的高精度计算包括加(addition)、减(subtract)、乘(multiply)、除(divide)四种基本运算。其中乘法分高精度数乘高精度数和单精度数乘高精度数两种,除法一般指两个单精度数相除,求解最终指定精度的解,找出循环节或输出指定精度位数的小数。(注:高精度数与单精度数均指整数) 主要的解题思想是利用在小学就曾学习过的坚式加减乘除法则,用程序语言实现存在的问题主要有如何存储高精度数的值,如何实现计算等问题。 一. 高精度数字的存储 我们日常书写一个高精度数字,左侧为其高位,右侧为其低位,在计算中往往会因进位(carry )或借位(borrow )导致高位增长或减少,因此我们定义一个整型数组(int bignum[maxlen])从低位向高位实现高精度整数的存储,数组的每个元素存储高精度数中的一位。(如下表所示) 高精度数 3(高位) …… 7 9 4(低位) int bignum[i] n …… 2 1 显然,在C++语言中,int 类型(4个字节/32位计算机)元素存储十进制的一位数字非常浪费空间,并且运算量也非常大,因此常将程序代码优化为万进制,即数组的每个元素存储高精数字的四位。在后面的叙述过程中均以万进制为例介绍。(为什么选择万进制,而不选择更大的进制呢?十万进制中的最大值99999相乘时得到的值是9999800001超过4个字节的存储范围而溢出,从而导致程序计算错误。) 在实际编写程序代码过程中常作如下定义: const int base=10000; const int maxlen=1000+1; int bignum[maxlen]; 说明:base 表示进制为万进制,maxlen 表示高精度数的长度,1个元素能存储4个十进制位,1000个元素就存储4000个十进制位,而加1表示下标为0的元素另有它用,常用作存储当前高精度数字的位数。 二. 各种运算的程序实现 (一)加法: 首先回顾一下小学中曾学习的坚式加法,见图一: bignum1[] 9475 46 1243 bignum2[] 918 1324 341 carry 1 0 0 0 bignum_ans[] 1 393 1370 1584 图一 加法的计算过程 从上面的图中我们可以得知,做加法运算是从低位向高位进行,如果有进位,下一位进行相加时要加上进位,如果最高位已计算完还有进位,就要增加存储结果的位数,保存起进位来。关于进位的处理,往往定义单独变量carry 进行存储,程序实现的过程如图二所示: 图二 加法的实现过程 初始化 进位carry 赋初始值0,结果的位数为两个加数的最大位数。 当前位超过最高位了? 处理当前位和进位 N Y 还有进位么? N 结束 处理进位 Y

圆周率的计算历程及意义

圆周率π的计算历程及意义 李毫伟 数学科学学院数学与应用数学学号:080412047 指导老师:王众杰 摘要: 圆周率π这个数,从有文字记载的历史开始,就引起了人们的兴趣.作为一个非常重要的常数,圆周率π最早是出于解决有关圆的计算问题.仅凭这一点,求出它的尽量准确的近似值,就是一个极其迫切的问题了.几千年来作为数学家们的奋斗目标,古今中外的数学家为此献出了自己的智慧和劳动.回顾历史,人类对π的认识过程,反映了数学和计算技术发展情形的一个侧面.π的研究在一定程度上反映这个地区或时代的数学水平. 关键词: 圆周率; 几何法; 分析法; 程序 1、实验时期 通过实验对π值进行估算,这是计算π的第一个阶段.这种对π值的估算基本上都是以观察或实验为根据,是基于对一个圆的周长和直径的实际测量而得出来 π=这个数据,最早见于有文字记载的基督教《圣经》的.在古代,实际上长期使用3 中的章节,其上取圆周率π为3.这一段描述的事大约发生在公元前950年前后.其他如巴比伦、印度、中国等也长期使用3这个粗略而简单实用的数值.在我国刘徽之前“圆径一而周三”曾广泛流传.我国第一部《周髀算经》中,就记载有“圆周三径一”这一结论.在我国,木工师傅有两句从古流传下来的口诀:叫做:“周三径一,方五斜七,”意思是说,直径为1的圆,周长大约是3,边长为5的正方形,对角线之长约为7,这正反应了人们早期对π和2这两个无理数的粗略估计.东汉时期,官方还明文规定圆周率取3为计算圆的面积的标准,后人称之为古率. 早期的人们还使用了其它的粗糙方法.如古埃及、古希腊人曾用谷粒摆在圆形上,以数粒数与方形对比的方法取得数值.或用匀重木板锯成圆形和方形以秤量对比取值……由此,得到圆周率π的稍好些的值.如古埃及人应用了约四千年的()≈2984 3.1605.在印度,公元前六世纪,曾取π≈10≈3.162.在我国东、西汉之

高精度算法(c语言版)

高精度算法 #include #include #include #include int an,bn,fa=1,fb=1; /* 把an,bn,k设为全局变量,an纪录第一个高精度数组的位数,bn纪录第二个高精度数组的位数,k纪录输出结果的位数*/ char b1[250], b2[250]; /*纪录需要计算的两个高精度数据*/ void input(int a1[],int a2[]) /*函数input为输入函数,用来纪录两个待计算的高精度数据,以数组首地址为参数.以实现返回两个高精度数据*/ { int i,ai=1,bi=1; scanf ( "%s%s", b1, b2 ); /*输入两个高精度数据*/ an = strlen( b1 ); /*an纪录b1的位数*/ bn = strlen( b2 ); /*bn纪录b2的位数*/ if(b1[0]==45) { an--; fa=-1;ai=0;} /*判断数组的符号*/ if(b2[0]==45) { bn--; fb=-1;bi=0;} for (i=0; i0||q) { if(an>bn) k=an; else k=bn; /*用k纪录结果的最小位数*/ for(i=0;i=0;i--) printf("%d",c[i]); /*输出结果*/ return; } else subtraction(a,b,1); return;

图论算法及matlab程序的三个案例

图论实验三个案例 单源最短路径问题 Dijkstra 算法 Dijkstra 算法是解单源最短路径问题的一个贪心算法。其基本思想是,设置一个顶点集合S 并不断地作贪心选择来扩充这个集合。一个顶点属于集合S 当且仅当从源到该顶点的最短路径长度已知。设v 是图中的一个顶点,记()l v 为顶点 v 到源点v 1的最短距离, ,i j v v V ?∈,若 (,)i j v v E ?,记i v 到j v 的权ij w =∞。 Dijkstra 算法: ① 1{}S v =,1()0l v =;1{}v V v ??-,()l v =∞,1i =,1{}S V v =-; ② S φ=,停止,否则转③; ③ ()min{(),(,)} j l v l v d v v =, j v S ∈,v S ?∈; ④ 存在 1 i v +,使 1()min{()} i l v l v +=,v S ∈; ⑤ 1{} i S S v +=, 1{} i S S v +=-,1i i =+,转②; 实际上,Dijkstra 算法也是最优化原理的应用:如果12 1n n v v v v -是从1v 到 n v 的最短路径,则 12 1 n v v v -也必然是从1v 到 1 n v -的最优路径。 在下面的MATLAB 实现代码中,我们用到了距离矩阵,矩阵第i 行第j 行元 素表示顶点i v 到j v 的权ij w ,若i v 到j v 无边,则realmax ij w =,其中realmax 是 MATLAB 常量,表示最大的实数+308)。 function re=Dijkstra(ma)

高精度算法大全

高精度算法大全 在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字. 一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据 的一种模拟加,减,乘,除,乘方,阶乘,开放等运算. 譬如一个很大的数字N >= 10^ 100, 很显然这样的数字无法在计算机中 正常存储. 于是, 我们想到了办法,将这个数字拆开,拆成一位一位的或者是四位四 位的存储到一个数组中, 用一个数组去表示一个数字.这样这个数字就被称谓是高精度数. 对于高精度数,也要像平常数一样做加减乘除以及乘方的运算,于是就有了高精度算法: 由于计算机输入计算结果的精度通常受到计算机的限制,如:在双精度方式下,计算机最多只能输出16位有效数字,如果超过16位,则只能按浮点形式输出,另外,一般计算机实数表示的范围为1038,如果超过这个范围,计算机就无法表示了。但是我们可以通过一些简单的办法来解决这个问题。这就是我们要说的高精度计算机。 一、基本方法:在计算机上进行高精度计算,首先要处理好以下几个基本问题: 1、数据的接收与存储; 2、计算结果位数的确定; 3、进位处理和借位处理; 4、商和余数的求法; 下面我们逐一介绍一下这几个问题的解决方法。 1、数据的接收与存储: 要在计算机上进行高精度计算,首先就应该有精确的输入,即计算机要精确地接收和存储数据。通常: ①、当输入的数值在计算机允许的范围内时,可以用数值型变量来接收数据。 ②、当输入的数据超过计算机允许显示的精度范围时,采用字符来接收数据。

③、分离各位数字。 接收数据子模块(字符型变量接收数据): prucedure readdata(var in:array[1..100] of integer); var ch:char; i,k:integer; begin read(ch);k:=0; while ch in['0'..'9'] do begin inc(k);int[k]:=ord(ch)-48; read(ch); end; end; 2、计算结果位数的确定 ①、两数之和的位数最大为较大的数的位数加1。 ②、乘积的位数最大为两个因子的位数之和。 ③、阶乘:lgn!=lgn+lg(n-1)+lg(n-2)...................+lg3+lg2+lg1 =lnn/ln10+ln(n-1)/ln10+ln(n-2)/ln10+................+ln3/ln10+ln2/ln1 0+ln1/ln10 =trunc(1/ln10* (lnn+ln(n-1)+ln(n-2)+...........+ln3+ln2+ln1) ) 乘方:lg(a ^b)=trunc(lg(a^b))+1 =trunc(b*lg a )+1 =trunc(b*ln a / ln10)+1 3、进位处理和借位处理 ①、加法的进位处理 进行加法处理时,先设置一个加法进位标志 T,并将 T 的初值设为 0。当两数相加时, 从低位到高位,各位数字分别相加,如果相加后某个单元中的数大于 10,则将该单元中的数

数学实验:怎样计算圆周率

怎样计算 姓名: 学号 班级:数学与应用数学4班

实验报告 实验目的:自己尝试利用Mathematica软件计算的近似值,并学会计算的近似值的方法。 实验环境:Mathematica软件 实验基本理论和方法: 方法一:数值积分法(单位圆的面积是,只要计算出单位圆的面积也就计算出了的值) 其具体内容是:以单位圆的圆心为原点建立直角坐标系,则单位圆在第一象限内的部分G是一个扇形, 由曲线()及坐标轴围成,它的面积是,算出了S的近似值,它的4倍就是的近似值。而怎样计算扇形G的面积S的近似值呢?如图

图一 扇形G中,作平行于y轴的直线将x轴上的区间[0,1](也就是扇形在x轴上的半径)分成n等份(n=20),相应的将扇形G分成n个同样宽度1/n的部分()。每部分是一个曲边梯形:它的左方、右方的边界是相互平行的直线段,类似于梯形的两底;上方边界是一段曲线,因此称为曲边梯形。如果n很大,每个曲边梯形的上边界可以近似的看成直线段,从而将近似的看成一个梯形来计算它的面积;梯形的高(也就是它的宽度)h=1/n,两条底边的长分别是和,于是这个梯形面积可以作为曲边梯形面积的近似值。所有这些梯形面积的和T就可以作为扇形面积S的近似值: n越大,计算出来的梯形面积之和T就越接近扇形面积S,而4T就越接近的准确值。 方法二:泰勒级数法 其具体内容是:利用反正切函数的泰勒级数 计算。 方法三:蒙特卡罗法

其具体内容是:单位正方形的面积=1,只要能够求出扇形G 的面积S在正方形的面积中所占的比例,就能立即得到S,从而得到的值。而求扇形面积在正方形面积中所占的比例k的值,方法是在正方形中随机地投入很多点,使所投的每个点落在正方形中每一个位置的机会均等,看其中有多少个点落在扇形内。将落在扇形内的点的个数m与所投的点的总数n的比可以作为k的近似值。能够产生在区间[0,1]内均匀分布的随机数,在Mathematica中语句是 Random[ ] 产生两个这样的随机数x,y,则以(x,y)为坐标的点就是单位正方形内的一点P,它落在正方形内每一个位置的机会均等。P落在扇形内的充分必要条件是。这样利用随机数来解决数学问题的方法叫蒙特卡罗法。 实验内容、步骤及其结果分析: 问题1:在方法一中,取n=1000,通过计算图一中扇形面积计算的的近似值。 分析:图一中的扇形面积S实际上就是定积分。 与有关的定积分很多,比如的定积分

大学计算机基础mooc习题集整理(含答案解析)

大学计算机考试模拟题(理工类) 一、简答题(本题共6个小题,每小题5分,共30分) 1. 什么是信息社会?信息社会的主要特征是什么?P32 第4题参见P13 P14 2. 什么是CPU,简述CPU的基本组成和功能P108 第18.(1) 参见P77 3. 什么是操作系统?简述操作系统的主要功能。P109 第24题参见P89 4. 人类问题求解的一般思维过程是什么?简要说明参见P112图3-1 描述 5. 什么是枚举法?说明枚举法的优缺点。参见P113第6段, P132穷举法 6. 什么是浏览器/服务器(B/S)三层体系结构,画图并简要说明。P340第10题参见P316 P276 二、单项选择题(本题共20个小题,每小题1分,共20分) 1. 下列容不属于信息素养(Information Literacy)的是 A.信息意识B.信息知识 C.分析能力D.信息道德 2. 阿兰·麦席森·图灵(Alan Mathison Turing)对计算机科学的发展做出了巨大贡献,下列说法不正确的是 A.图灵是著名的数学家、逻辑学家、密码学家,被称为计算机科学之父。 B.图灵最早提出关于机器思维的问题,被称为人工智能之父。 C.图灵创立了二进制。 D.“图灵奖”是为奖励那些对计算机科学研究与推动计算机技术发展有卓越贡献的杰出科学家而设立的。 3. 最早的机械式计算机“加法器”的发明人是 A.帕斯卡B.巴贝奇 C.莱布尼茨D.布尔 4. 巴贝奇的“分析机”到他终生都没有制造出来,下列说确的是()

A.设计原理有错误B.设计精度不够 C.设计图纸不够完善D.机械加工的工艺水平达不到它要求的精度 5. 以集成电路为基本元件的第三代计算机出现的时间为()。A.1965—1969B.1964—1975 C.1960—1969D.1950—1970 6. 在计算机中,引入16进制,主要目的是()。 A.计算机中的数据存储采用16进制 B.计算机中的数据运算采用16进制 C.缩短2进制字串的长度 D.计算机的存地址采用16进制编制 7. 设计算机字长为16位,采用补码表示,可表示的整数的取值围是()。A.0~65535B.-32767~32767 C.-32768~32767D.-32767~32768 8. 下列叙述中,正确的是( )。 A.所有十进制小数都能准确地转换为有限位二进制小数 B.汉字的计算机码就是国标码 C.所有二进制小数都能准确地转换为十进制小数 D.存储器具有记忆能力,其中的信息任何时候都不会丢失 9. 关于微处理器,下列说法错误的是() A、微处理器就是微机的CPU,由控制器运算器和存储器组成。 B、微处理器不包含存储器。 C、微处理器执行CPU控制部件和算术逻辑部件的功能。 D、微处理器与存储器和外围电路芯片组成微型计算机。 10. 关于操作系统,下列叙述中正确的是()。

信息学奥赛一本通算法(C版)基础算法:高精度计算

高精度加法(大位相加) #include using namespace std; int main() { char a1[100],b1[100]; int a[100],b[100],c[100];//a ,b,c 分别存储加数,加数,结果int lena,lenb,lenc,x,i; memset(a,0,sizeof(a));// 数组a 清零memset(b,0,sizeof(b));// 数组b 清零 memset(c,0,sizeof(c));// 数组c 清零//gets(a1); //gets(b1); //getchar(); while(scanf("%s%s",&a1,&b1)!=EOF) { lena=strlen(a1); lenb=strlen(b1); for(i=0;i<=lena;i++) a[lena-i]=a1[i]-'0';〃将数串al转化为数组a,并倒序存储//a[i]=a1[lena-i-1]-48; for(i=0;i<=lenb;i++) b[lenb-i]=b1[i]-'0';〃将数串al转化为数组a,并倒序存储//b[i]=b1[lenb-i-1]-48; lenc=1; //lenc 表示第几位 x=0; //x 是进位while(lenc<=lena||lenc<=lenb) { c[lenc]=a[lenc]+b[lenc]+x;// 第lenc 位相加并加上次的进位x=c[lenc]/10;// 向高位进 位 c[lenc]%=10;// 存储第lenc 位的值lenc++;// 位置下标变量 } c[lenc]=x; if(c[lenc]==0) lenc--; //处理最高进位 for(i=lenc;i>=1;i--) cout< using n amespace std; int mai n() { char n[256], n1[256], n2[256];

圆周率200位记忆口诀

圆周率的来源和2000位 “圆周率”即圆的周长与其直径之间的比率。关于它的计算问题,历 来是中外数学家极感兴趣、孜孜以求的问题。德国的一位数学家曾经说过:“历史上一个国家所算得的圆周率的准确程度,可以作为衡量这个国家当时数学发展的一个标志。”我国古代在圆周率的计算方面长期领先于世界水平,这应当归功于魏晋时期数学家刘徽所创立的新方法一一“割圆术”。 所谓“割圆术”,是用圆内接正多边形的周长去无限逼近圆周并以此求取圆周率的方法。这个方法,是刘徽在批判总结了数学史上各种旧的计算方法之后,经过深思熟虑才创造出来的一种崭新的方法。 中国古代从先秦时期开始,一直是取“周三径一”(即)的数值来进行有关圆的计算。但用这个数值进行计算的结果,往往误差很大。正如刘徽所说,用“周三径一”计算出来的圆周长,实际上不是圆的周长而是圆内接正六边形的周长,其数值要比实际的圆周长小得多。东汉的张衡不满足于这个结果,他从研究圆与它的外切正方形的关系着手得到圆周率。这个数值比“周三径一”要好些,但刘徽认为其计算出来的圆周长必然要大于实际的圆周长,也不精确。刘徽以极限思想为指导,提出用“割圆术”来求圆周率,既大胆创新,又严密论证, 从而为圆周率的计算指出了一条科学的道路。 在刘徽看来,既然用“周三径一”计算出来的圆周长实际上是圆内接正六边形的周长,与圆周长相差很多;那么我们可以在圆内接正六边形把圆周等分为六条弧的基础上,再继续等分,把每段弧再分割为二,

做出一个圆内接正十二边形,这个正十二边形的周长不就要比正六边形的周长更接近圆周了吗?如果把圆周再继续分割,做成一个圆内接正二十四边形,那么这个正二十四边形的周长必然又比正十二边形的周长更接近圆周。这就表明,越是把圆周分割得细,误差就越少,其内接正多边形的周长就越是接近圆周。如此不断地分割下去,一直到圆周无法再分割为止,也就是到了圆内接正多边形的边数无限多的时候,它的周长就与圆周“合体”而完全一致了。 按照这样的思路,刘徽把圆内接正多边形的面积一直算到了正3072 边形,并由此而求得了圆周率为3.14和3.1416这两个近似数值。这个结果是当时世界上圆周率计算的最精确的数据。刘徽对自己创造的这个“割圆术”新方法非常自信,把它推广到有关圆形计算的各个方面,从而使汉代以来的数学发展大大向前推进了一步。 以后到了南北朝时期,祖冲之在刘徽的这一基础上继续努力,终于求得了圆周率:精确到了小数点以后的第七位。在西方,这个成绩是由法国数学家韦达于1593年取得的,比祖冲之要晚了一千一百多年。祖冲之还求得了圆周率的两个分数值,一个是“约率”22/7 ,另一个 是“密率” 355/113 ,其中355/113 这个值,在西方是由德国的奥托和荷兰的安东尼兹在16世纪末才得到的,都比祖冲之晚了一千一一百年。刘徽所创立的“割圆术”新方法对中国古代数学发展的重大贡献,历史是永远不会忘记的。 答应了大宝,教她点东西,才知道自己才疏学浅,不知道教她什么。偶尔看到巧计圆周率,就截图下来和她一起背,呵呵还真的有效,花三

相关主题
文本预览
相关文档 最新文档