程序设计算法基础.docx

上传人:b****6 文档编号:6670039 上传时间:2023-01-08 格式:DOCX 页数:36 大小:45.38KB
下载 相关 举报
程序设计算法基础.docx_第1页
第1页 / 共36页
程序设计算法基础.docx_第2页
第2页 / 共36页
程序设计算法基础.docx_第3页
第3页 / 共36页
程序设计算法基础.docx_第4页
第4页 / 共36页
程序设计算法基础.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

程序设计算法基础.docx

《程序设计算法基础.docx》由会员分享,可在线阅读,更多相关《程序设计算法基础.docx(36页珍藏版)》请在冰豆网上搜索。

程序设计算法基础.docx

程序设计算法基础

程序设计算法基础

递推算法[1]:

1.数列求和:

数列求和的基本形式是S=1+2+3+…+n或S=1*2*3*…*n,其算法思想是设定一个变量作为累加器或累乘器,然后不断使它的值增加一个指定的有规律的序列的某一项的值。

考点:

循环语句的使用,循环变量的递增量或递减量,循环次数的确定,以及S=S+i(循环变量)或S=S*i(循环变量)的理解,其特点为:

循环次数(或上下界)确定,循环变量的递增量或递减量为一常数C;一般只包含以下三种形式:

1形如S=1+2+3+…+n:

✧算法思想:

确定循环次数(或上下界),确定循环变量的递增量或递减量,使用一个for循环即可解决问题

◆示例代码:

◆s=0

◆fori=1tonstep1

◆s=s+i

◆endfor

2形如S=1-2+3-4+…+(2n-1)-2n:

✧算法思想:

确定循环次数(或上下界),确定循环变量的递增量或递减量,使用一个for循环,在循环中根据循环变量的当前值判断其正负号,即可解决问题

◆示例代码:

◆s=0

◆fori=1tonstep1

◆ifi%2==0

◆s=s-i

◆else

◆s=s+i

◆endif

◆endfor

3形如S=1+(1+2)+(1+2+3)+…+(1+2+3+…+n):

✧算法思想:

这种题目的规律是:

求累加和,同时累加和中的每一项又是一个累加和,每一项的累加的个数有规律可寻;解决这种问题的基本思路是:

使用两个循环语句,一个外层循环包含一个内层循环(称为循环嵌套);外层循环用于计算最终的累加和,而内层循环用于计算每一项的累加和,内层循环的循环次数由外层循环当前的循环变量的值确定。

◆示例代码:

◆sa=0

◆fori=1tonstep1

◆sb=0

◆forj=1toistep1

◆sb=sb+j

◆endfor

◆sa=sa+sb

◆endfor

2.常用级数:

级数与数列求和的表现形式和算法思想基本是一致的,其区别只有一个:

在一般情况下,级数的计算不知道确切的循环次数,而只知道级数计算的结束条件。

因此级数的计算适合采用dowhile循环而不是for循环;

形如

,直到

✧算法思想:

确定循环结束的条件,使用dowhile循环即可解决问题;同时注意的是,在计算级数时也有可能使用循环嵌套(如此题),解题思路除使用dowhile循环外与数列求和基本一致

◆示例代码:

◆input“请输入x的值:

”tox

◆n=1

◆fn=1&&fn的值为1!

◆ex=1+x&&ex的值初始化

◆dowhile(x^n)/fn>1e-6

◆n=n+1

◆fn=1&&fn的值初始化

◆fori=1ton

◆fn=fn*i

◆endfor

◆ex=ex+(x^n)/fn

◆n=n+1

◆enddo

3.梯形积分法:

利用程序求积分的方法都是一样的,基本上与级数的计算方法一模一样,只是需要了解公式中各参数的含义

形如

=

✧算法思想:

先确定公式中各个参数的含义(需要一定的高等数学知识),再观察各参数变化的规律,最后根据题目要求使用dowhile循环或for循环求解

◆示例代码:

◆input“请输入分割次数n的值:

”ton

◆a=0

◆b=pi()/2&&或者b=3.14159/2

◆h=(b-a)/n

◆sinx=(h/2)*(sin(a)-sin(b))&&剥离不变项,作为初始值

◆fori=1ton

◆sinx=sinx+h*sin(a+i*h)

◆endfor

初等数论问题[1]:

1.最大公约数:

使用程序求两个正整数的最大公约数,其方法一般采用所谓辗转相除法,即两个正整数的最大公约数等于其中较小的数与两数的差的最大公约数。

考点:

掌握常用算法思想,循环语句的使用

形如:

使用键盘输入a和b的值,假设a=252,b=105,求其最大公约数

✧算法思想:

按照辗转相除法的定义

✧第一步:

确定252>105,则252%105=42,42!

=0;

✧第二步:

因为105>42,则105%42=21,21!

=0

✧第三步:

因为42>21,则42%21=0,故最大公约数为21

◆示例代码:

◆input“请输入正整数a的值:

”toa

◆input“请输入正整数b的值:

”tob

◆ifa>b

◆big=a

◆small=b

◆else

◆big=b

◆small=a

◆endif

◆flag=.t.

◆dowhileflag

◆r=big%small

◆ifr==0

◆factor=small

◆flag=.f.

◆else

◆big=small

◆small=r

◆endif

◆enddo

2.最小公倍数:

使用程序求两个正整数的最小公倍数,其方法一般借助两数的最大公约数,即假设两个正整数A、B,它们的最大公约数为C,那么它们的最小公倍数等于A*B/C。

考点:

掌握常用算法思想,循环语句的使用

形如:

使用键盘输入a和b的值,假设a=252,b=105,求其最小公倍数

✧算法思想:

先算出其最大公约数,再利用公式求解其最小公倍数即可

◆示例代码:

◆input“请输入正整数a的值:

”toa

◆input“请输入正整数b的值:

”tob

◆ifa>b

◆big=a

◆small=b

◆else

◆big=b

◆small=a

◆endif

◆flag=.t.

◆dowhileflag

◆r=big%small

◆ifr==0

◆factor=small

◆flag=.f.

◆else

◆big=small

◆small=r

◆endif

◆enddo

◆maxmulti=int(a*b/factor)

3.穷举法:

设定一个穷举区间(有限),将区间中的值一个值一个值的代入到公式中计算结果是否满足,直到找到满足条件的值或穷举区间中的所有值都试过了为止

考点:

掌握常用算法思想,循环语句的使用,循环控制语句(exit)的使用

形如:

使用键盘输入a和b的值,假设a=252,b=105,求其最大公约数和最小公倍数

✧算法思想:

可以使用上面讲述的方法,也可以使用穷举法;若使用穷举法,则先确定穷举区间或结束穷举的条件,然后依次代入值进行计算即可

◆示例代码:

◆input“请输入正整数a的值:

”toa

◆input“请输入正整数b的值:

”tob

◆ifa>b

◆big=a

◆small=b

◆else

◆big=b

◆small=a

◆endif

◆*穷举法求最大公约数

◆forn=smallto1step-1

◆ifbig%n==0.and.small%n==0

◆exit

◆endif

◆endfor

◆factor=n

◆*穷举法求最小公倍数

◆form=bigtobig*smallstep1

◆ifm%big==0.and.m%small==0

◆exit

◆endif

◆endfor

◆maxmulti=m

4.素数(质数):

素数,即正整数中除了1之外,只能被自身和1整除的数称为素数,要证明某个数是否是素数或找到某一区间的正整数中有哪些素数,通常使用穷举法

考点:

掌握常用算法思想,循环语句的使用,循环控制语句(exit)的使用

形如:

找到2~100区间中的所有的素数

✧算法思想:

要判断某个数是否是素数,只需要使用穷举法,以2~(该数自身-1)作为穷举区间,验证该数是否能够被该区间的正整数除尽,若能,则该数不是素数;若不能,则该数即为素数

◆示例代码:

◆forn=2to100

◆flag=.t.

◆ifn==2

◆?

n

◆else

◆fori=2ton-1

◆ifn%i==0

◆flag=.f.

◆exit

◆endif

◆endfor

◆ifflag

◆?

n

◆endif

◆endif

◆endfor

5.三个数的最大数和最小数:

求n个数的最大数与最小数的基本方法是:

设定一个变量max或min,用于保存当前已知的最大值或最小值,然后再将其与其它数字进行比较,每一次都保证其中的值是当前已知的最大值或最小值即可

考点:

掌握常用算法思想

形如:

请用键盘输入3个值,输出其中的最大值和最小值

✧算法思想:

键盘输入3个值,分别保存进a,b,c三个变量中,设置一个保存最大值的变量max_abc,初始化为a,b,c三个变量中的任意一个,一般为a,即max_abc=a;再使用max_abc与b进行比较,若max_abc>b,则max_abc的值不变,否则max_abc=b;再使用max_abc与c进行比较,若max_abc>c,则max_abc的值不变,否则max_abc=c;最后max_abc中保存的值即为a,b,c三数中的最大值。

求其最小值的方法同理

◆示例代码:

◆input“请输入数字a:

”toa

◆input“请输入数字b:

”tob

◆input“请输入数字c:

”toc

◆*求最大值

◆max_abc=a

◆ifmax_abc

◆max_abc=b

◆endif

◆ifmax_abc

◆max_abc=c

◆endif

◆*求最小值

◆min_abc=a

◆ifmin_abc>b

◆min_abc=b

◆endif

◆ifmin_abc>c

◆min_abc=c

◆endif

◆?

a,b,c,”三个值的最大值为:

”,max_abc

◆?

a,b,c,”三个值的最小值为:

”,min_abc

初等数论问题[2]:

1.求n个数中的最大数和最小数:

求n个数的最大数与最小数的基本方法是:

设定一个变量max或min,用于保存当前已知的最大值或最小值,然后再将其与其它数字进行比较,每一次都保证其中的值是当前已知的最大值或最小值即可

考点:

掌握常用算法思想,掌握数组的使用

形如:

请用键盘输入10个数,输出其中的最大值和最小值

✧算法思想:

键盘输入10个数,将这10个数依次保存进一个数组中,设置一个保存最大值的变量max_n,初始化为输入的10个数中的任意一个,一般为数组的第一个值;再使用max_n依次与数组中的每一个值进行比较,将当前大于max_n的值保存在max_n中;最后max_n中保存的值即为10个数中的最大值。

求其最小值的方法同理

◆示例代码:

◆dimensiona(10)

◆fori=1to10step1

◆input“请输入一个数字”toa(i)

◆endfor

◆*求最大值

◆max_n=a

(1)

◆forj=2to10step1

◆ifa(j)>max_n

◆max_n=a(j)

◆endif

◆endfor

◆*求最小值

◆min_n=a

(1)

◆forj=2to10step1

◆ifa(j)

◆min_n=a(j)

◆endif

◆endfor

◆?

”最大值为:

”,max_n

◆?

”最小值为:

”,min_n

2.斐波拉契数列:

Fibonacci数列F(n)的定义为:

F(0)=0,F

(1)=1,F(n)=F(n-1)+F(n-2)

考点:

掌握常用算法思想,掌握数组的使用

形如:

请保存并输出Fibonacci数列的前20项的值,每行输出5个

✧算法思想:

定义一个数组,长度为20;将该数组初始化为f

(1)=0,f

(2)=1;然后依次计算f(i)=f(i-1)+f(i-2)(i>=3),直到i=20(即数组长度)

◆示例代码:

◆dimensionf(20)

◆f

(1)=0

◆f

(2)=1

◆fori=3to20

◆f(i)=f(i-1)+f(i-2)

◆endfor

◆fori=1to20

◆?

?

f(i)

◆ifi%5==0

◆?

◆endif

◆endfor

排序算法:

1.选择排序:

所谓排序即是通过某种方法使一系列的数据按大小顺序先后依次排列,从小到大排序,称为升序;从大到小排序,称为降序。

排序算法很多,选择排序与冒泡排序是大纲要求的。

选择排序的算法思想是:

每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完为止

考点:

掌握常用算法思想,掌握数组和循环语句的使用

形如:

请用键盘输入10个数,将之保存在一个数组中,然后再按升序(或降序)将该数组排序

✧算法思想(不借助辅助数组):

键盘输入10个数,将这10个数依次保存进一个数组s中;然后,每次都从s中取出当前最小(降序)或最大(升序)的元素,将之与s中未排好序的数列的末尾进行交换,直到s中的数据元素已经全部有序时为止。

◆示例代码(升序):

◆clear

◆dimensions(10)

◆fori=1to10step1

◆input“请输入一个数字:

”tos(i)

◆endfor

◆fori=10to1step-1

◆p=1

◆forj=1toistep1

◆ifs(j)>s(p)

◆p=j

◆endif

◆endfor

◆t=s(i)

◆s(i)=s(p)

◆s(p)=t

◆endfor

◆fori=1to10

◆?

?

s(i)

◆endfor

◆return

 

2.冒泡排序:

冒泡排序的算法思想是:

依次比较相邻的两个数,将小数放在前面,大数放在后面(升序,若为降序的话则相反);如此重复,直到数列有序

考点:

掌握常用算法思想,掌握数组和循环语句的使用

形如:

请用键盘输入10个数,将之保存在一个数组中,然后再按升序(或降序)将该数组排序

✧算法思想:

键盘输入10个数,将这10个数依次保存进一个数组s中;然后,依次比较相邻的两个数,将小数放在前面,大数放在后面(升序,若为降序的话则相反),直到s中的数据元素已经全部有序时为止。

◆示例代码(升序):

◆clear

◆dimensions(10)

◆fori=1to10step1

◆input“请输入一个数字:

”tos(i)

◆endfor

◆fori=10to1step-1

◆forj=1toi-1step1

◆ifs(j)>s(j+1)

◆t=s(j)

◆s(j)=s(j+1)

◆s(j+1)=t

◆endif

◆endfor

◆endfor

◆fori=1to10

◆?

?

s(i)

◆endfor

◆return

查找算法:

1.顺序查找:

所谓查找即给定一个或多个关键字,在一个序列中匹配有无与给定关键字相等或满足条件的数据元素,若有,则查找成功,一般需要输出匹配成功的数据元素的位置;若无,则查找失败,一般需要给出查找失败的信息。

顺序查找不要求待查找的数列有序

考点:

掌握常用算法思想,掌握数组和循环语句的使用

形如:

请用键盘输入10个数,将之保存在一个数组中,判断输入的10个数中有没有与25相等的数;若有,输出它在数组中的位置。

✧算法思想:

键盘输入10个数,将这10个数依次保存进一个数组s中;然后,依次判断s

(1)~s(10)中的每个数是否与给定的值相等,若有,输出s(i)的位置i;若无,输出查找失败的提示信息。

◆示例代码:

◆clear

◆dimensions(10)

◆fori=1to10step1

◆input“请输入一个数字:

”tos(i)

◆endfor

◆flag=.t.

◆fori=1to10step1

◆ifs(i)==25

◆?

”找到等于25的数据,它是数组的第”+str(i,2)+”项”

◆flag=.f.

◆endif

◆endfor

◆ifflag

◆?

”该数组中不存在与25相等的数据元素,查找结束!

◆endif

◆return

2.折半查找:

折半查找是一种查找算法,其算法的实现依赖于一个前提:

待查找的数列必须有序(升序或降序皆可)

考点:

掌握常用算法思想,排序算法的使用,掌握数组和循环语句的使用

形如:

请用键盘输入10个数,将之保存在一个数组中,利用折半查找的方法,判断输入的10个数中有没有与25相等的数。

✧算法思想:

键盘输入10个数,将这10个数依次保存进一个数组s中,然后按升序排序(降序也可,这里用的升序);然后,记录当前数列的查找范围,令low=1,high=10,然后,比较位于数列中的第int((low+high)/2)个数据元素的值是否与给定的关键字相等。

若相等,则已经找到;若不相等,则分两种情况:

如果当前数据的值大于给定的关键字的值,则说明在该数列中有可能与该关键字相等的数据元素处于low=1,high=int((low+high)/2)-1这个范围内,则应再在此范围内进行查找;反之,则应当令low=int((low+high)/2)+1,high=10,然后在此范围内进行查找。

循环往复,直到找到与给定关键字相等的数据元素或low>high为止。

◆示例代码(升序):

◆clear

◆dimensions(10)

◆fori=1to10step1

◆input“请输入一个数字:

”tos(i)

◆endfor

◆fori=10to1step-1

◆forj=1toi-1step1

◆ifs(j)>s(j+1)

◆t=s(j)

◆s(j)=s(j+1)

◆s(j+1)=t

◆endif

◆endfor

◆endfor

◆low=1

◆high=10

◆dowhilelow<=high

◆ifs(int((low+high)/2))==25

◆?

”查找成功!

s(”+str(int((low+high)/2),2)+”)=25”

◆exit

◆else

◆ifs(int((low+high)/2))<25

◆low=int((low+high)/2)+1

◆else

◆high=int((low+high)/2)-1

◆endif

◆endif

◆enddo

◆iflow>high

◆?

”查找失败!

◆endif

◆return

递推算法[2]:

1.二分法:

二分法实际上是折半查找的算法思想与穷举法的结合,其目的在于求出f(x)=0时x的值。

假定f(x)在(a,b)范围内连续且异号,则在区间(a,b)内f(x)=0必有解;此时可求f((a+b)/2)是否等于0,若是,则(a+b)/2即为f(x)=0的解;否则,如果f((a+b)/2)>0而f(a)<0,则可令b=(a+b)/2,再循环迭代求解,直到f(x)=0或f(x)小于某给定阈值;反之,则可令a=(a+b)/2。

考点:

循环语句的使用,折半查找思想的应用

设f(x)=2x+3,求在区间(-10,10)之间f(x)=0(或|f(x)|<=10-6)的解

✧算法思想:

如果给定了取值区间,则令low=a,high=b,然后按照折半查找的思想求解即可;注意在计算的过程中一般不能保证f(x)=0,而只需要f(x)的值小于给定的阈值即可

◆示例代码:

◆clear

◆a=-10

◆b=10

◆x=(a+b)/2

◆dowhileabs(f(x))>1e-6

◆docase

◆casef(x)>0

◆b=x

◆casef(x)<0

◆a=x

◆endcase

◆x=(a+b)/2

◆enddo

◆?

x

◆return

◆functionf(x)

◆return2*x+3

◆endfunc

 

有序数列的插入、删除操作:

1.有序数列的插入:

有序数列的插入和删除操作一般与数列的查找、排序算法一起考,题目的形式一般为:

给定一个数列,有n个数据,存放在一个一维数组中(一般有序或要求学生自己排序);然后再给定一个值,将这个值插入到这个有序数组中,要求插入后的数列依然有序。

这种题目的算法步骤是一致的:

1按照题目要求找到插入点,使用查找算法

2插入给定数据,需要注意的是,如果在一个数组中插入新值,那么,首先,数组的长度要够;其次,在插入点之后的数组中的原数据都需要向后移动一位

请使用键盘输入1~100之间的10个数字,将之存放在一个数组中,按升序排序;之后再用键盘输入一个数字,将之插入到这个数组中,插入后的数组依然保持升序

✧算法思想:

虽然是在有序(升序)的数组中查找,但是这里使用顺序查找法是最方便的;查找中可能有三种情况:

1.如果待插入的数字比数组的第一个数字要小,则插入点为数组中的第一个位置;2.如果待插入的数字比数组的最后一个数字要大,则插入点为当前数组最后一个元素之后的位置,插入后数组不用执行移动操作;3.如果是在中间的位置,则插入点满足的条件是s(i)<待插入的数字

◆示例代码:

◆clear

◆dimensions(11)

◆fori=1to10step1

◆input“请输入10个1~100之间的数:

”tos(i)

◆endfor

◆input“请输入待插入的数:

”tox

◆*冒泡排序(升序)

◆fori=10to1step-1

◆forj=1toi-1step1

◆ifs(j)>s(j+1)

◆t=s(j)

◆s(j)=s(j+1)

◆s(j+1)=t

◆endif

◆endfor

◆endfor

◆*查找插入点

◆fori=1to10

◆docase

◆casex<=s

(1)

◆p=1

◆casex>=s(10)

◆p=10+1

◆otherwise

◆ifx>=s(i).and.x<=s(i+1)

◆p=i+1

◆endif

◆endcase

◆endfor

◆*从后往前移动数据,并在插入点插入待插入的数字

◆ifp==10+1

◆s(p)=x

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1