C++常用算法.docx

上传人:b****3 文档编号:10964108 上传时间:2023-05-28 格式:DOCX 页数:51 大小:98.26KB
下载 相关 举报
C++常用算法.docx_第1页
第1页 / 共51页
C++常用算法.docx_第2页
第2页 / 共51页
C++常用算法.docx_第3页
第3页 / 共51页
C++常用算法.docx_第4页
第4页 / 共51页
C++常用算法.docx_第5页
第5页 / 共51页
C++常用算法.docx_第6页
第6页 / 共51页
C++常用算法.docx_第7页
第7页 / 共51页
C++常用算法.docx_第8页
第8页 / 共51页
C++常用算法.docx_第9页
第9页 / 共51页
C++常用算法.docx_第10页
第10页 / 共51页
C++常用算法.docx_第11页
第11页 / 共51页
C++常用算法.docx_第12页
第12页 / 共51页
C++常用算法.docx_第13页
第13页 / 共51页
C++常用算法.docx_第14页
第14页 / 共51页
C++常用算法.docx_第15页
第15页 / 共51页
C++常用算法.docx_第16页
第16页 / 共51页
C++常用算法.docx_第17页
第17页 / 共51页
C++常用算法.docx_第18页
第18页 / 共51页
C++常用算法.docx_第19页
第19页 / 共51页
C++常用算法.docx_第20页
第20页 / 共51页
亲,该文档总共51页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C++常用算法.docx

《C++常用算法.docx》由会员分享,可在线阅读,更多相关《C++常用算法.docx(51页珍藏版)》请在冰点文库上搜索。

C++常用算法.docx

C++常用算法

C++常用算法

(笔试中有部分,主要是上机考试中的算法)

1.基本算法,输出格式控制等

●求多项式之和、之积

1)求sum(n)=1!

+2!

+3!

+…+n!

2)函数intfun(intnumber)返回Sn=1/1+1/2+1/3+…+1/number

3)函数fun(intn)计算在n范围内,能被7或11整除的所有整数的倒数和。

4)求:

●编写函数判断一个数是否是质数(素数)。

算法

●求两个数的最大公约数和最小公倍数。

算法

●编一个函数用于判断一个年份是否是闰年。

函数intfun(inty,intm,intd)计算并返回某年某月某日是当年的第几天。

(特殊情况:

若是闰年且月份大于3,则加一天)。

●求一个数的所有约数(因子);分解质因数。

5)函数fun(intn)计算所有n的因子之和(不包括自身)

6)求出x的所有约数,并调用函数写入文件中。

7)一个数恰好等于它的因子之和,这个数就称为“完数”,例如6=1+2+3。

编程找出1000以内的所有完数。

8)函数fun(intm,intn)判定两个数是否是亲和数。

亲和数的定义:

如果n的所有因子之和(因子除掉自身)等于m。

m的所有因子之和等于n,则判定m、n是互为亲和数。

9)函数fun(intn)完成的功能是将n分解为质数的积的形式。

如90=2×3×3×5。

简54题讲

●根据n的大小,输出由*组成的图形,如n=5,输出

***

*******

***********

***********

***********

●函数intfun(intn)输出一个n行的杨辉三角形。

●输出9×9口诀,涉及输出格式的控制。

●找出在某个范围内,满足条件的所有数

10)在自然数中寻找n个连续的合数(非质数)。

11)在某范围内(如10万以内),找出一个数,他加上100后是一个完全平方数,再加上268又是一个完全平方数。

12)水仙花数。

●函数boolfun(intn)判断n是否为回文数,如23632。

若是返回true,否则返回false。

本题包含了数的分解与合并算法。

简62题讲

2.数制转换

●将x的值转换成二进制数字符串输出到屏幕。

简8题讲

●将八进制组成的字符串转换成十进制值。

如:

“34”转换结果为:

28。

●将字符串形式表示的十六进制数转换成十进制整数,

如,“AD12”转换成整数44306。

程序

●函数voidTo8(char*des,char*str)的功能是将二进制数据转换成八进制数据。

如:

1001010的八进制数据为112。

二进制和八进制都是以字符串形式存放。

简47题讲

3.数的分解合并(循环分解,硬性分解%/)

●函数intfun(intn)实现求n的各个位上数字之和。

●函数intfun(intm,intn)将m的个位和十位放到一个数字z的百位和千位中,然后n的百位和千位放到z的个位和十位中,最后由函数返回z。

●给一个四位整数加密:

方法是每位数字加上5后除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换,然后返回得到的密码。

●函数fun(longs,long*t),使之从低位开始取出长整型变量s中偶数位上的数,依次构成一个新数放在t中。

例如当s中的数为7654321时,t中的数为:

642。

(涉及数的分解与合并)。

4.迭代

●函数doublefun(doublenumber)通过迭代法返回number的平方根。

迭代公式为:

Xn+1=0.5×(Xn+number/Xn)。

牛顿迭代法求数的平方根:

算法

●函数doublefun()实现求cos(x)=x的一个解。

程序采用迭代法,迭代法的实现思想如下:

(1)设x1=0;

(2)然后cos(x1)得到x2,如果x2与x1相差小于0.0000001则返回,即x2是解;

(3)如果大于0.0000001,则继续迭代。

5.递归

●递归求阶乘,非递归求阶乘。

●age(intn)函数实现的功能是:

在一起的n个人,问第n个人年龄是多少,他说比第n-1个人大2岁,问第n-1个人,说比第n-2个人大2岁,依次类推,最后一个人刚会数数字,才2岁。

问第n个人多大年龄。

●用递归算法实现数组a[]的前n个元素之和。

解答00

●函数fun(doublen,intk)实现的功能是求n的0~k次方的和。

即n0+n1+n2+n3+…+nk

要求:

要用递归实现。

提示:

fun(n,k)=fun(n,k-1)+n的k次方。

例如:

fun(2,4)=1+2+4+8+16=31

6.穷举法

●水仙花数。

(三重循环)

●函数fun(intN[4])的功能是用4个数字(如2、4、6、0),组成互不相同且无重复数字的三位数(百位数字不能是0),将满足条件的所有数输出到屏幕。

(三重循环)简23题讲

●在某范围内(如10万以内),找出一个数,他加上100后是一个完全平方数,再加上268又是一个完全平方数。

(单循环)

7.字符串操作

●自己编程实现strlen(),strcpy(),strcmp(),strcat()功能。

●函数voidfun(char*str)实现字符串的翻转(逆向存放)。

●函数intfun(char*str)实现的功能是判定给定的字符串是否构成回文。

忽略大小写,忽略非字母字符。

程序

●扫描字符串

Ø找出字符串数组中最大的ASCII值,并返回所在的位置;如果有相同变量,则输出最后一个所在的位置。

Ø字符串加密,将字母表看成循环表,某字母用其后的第7个字符替换。

Ø字符串加密,扫描一个串同时扫描另一个串,用指定的字符替换,如已知源码字母表“ADT”和密码字母表“XQF”,表示将主串中的字母A,D,T分别替换成X,Q,F。

返回指针值的函数。

程序

Ø统计字符串中各类字符出现的次数,指针做参数或引用做参数带回多个统计结果。

Ø将一个字符串与另一个字符串交叉生成第3个字符串。

例如“123”“abc”“1a2b3c”

Ø判断字符串中左右括号是否匹配。

例“((a+b)*c)”。

判断过程中,右括号数必须小于左括号数。

Ø将一个字符串中偶数位置上的字符取出,重复两次后放入新数组,如原串为“ABCDEF”,结果串为“AACCEE”。

(数组元素的偶数下标、奇数下标)。

Ø将字符串中的大写字母变成小写字母,同时将小写字母转换成大写字母,写入文件。

例如:

原串为“ABCdef”则结果串为“abcDEF”。

Ø函数intfun(char*str,int*a)将字符串中出现的数字转换成数值存储在整型数组a[]中,然后返回转换的个数。

例如:

str=“12341454abcdefg234”;

则:

a[]中的值为12341454234,返回11。

程序

●查找子串

Ø计算字符串str1中出现字符串str2的个数(即寻找子串出现的次数),忽略大小写。

简第2题讲

Ø求子串在主串中第n次出现时的位置;第一次出现的位置;最后一次出现的位置。

Ø查找子串位置,忽略大小写字母。

Ø提取字符串中介于两个子串之间的串。

Ø模式匹配,字符串处理,身份证号码校验,strncpy(),数字串转换为数值。

●插入子串,插入字符

Ø将字符串中指定的单词单数变复数,本质就是在字符串中插入s字母。

Ø字符串每4个值增加一个奇偶校验位,使保持偶数个1,借助于临时数组。

程序

例如:

0100101101011000

结果:

01001101110101010001

●删除子串,删除字母

Ø函数voidfun(char*str,charc)实现删除字符串中的所有字符c,然后将字符串返回。

Ø对字符数组中出现的相同字符只保留第1个。

函数fun(char*des,char*str)的功能是去掉字符串str中相同的字母,并将处理后的结果存到des所指字符串中。

例如:

输入:

Thisisatest!

输出:

Thisate!

Ø函数voidfun(char*str,char*del)实现将str中的一些字母删除,这些字母出现在指针del指向的字符串中。

如:

str="Iamastudent.",del="adet"

则:

str="Imsun."程序

●替换子串,替换字符

Ø函数voidfun(char*des,char*str1,char*str2,char*str3)实现把str1中出现的str2替换成字符串str3,并存放到des指向的字符串中。

例如:

str1:

"abcisabc."

str2:

"abc"

str3:

"book"

des:

"bookisbook."程序

Ø函数char*fun(char*des,char*str,charc,char*str2)的功能是:

如果str中包含字符“?

”,则替换成字符c

如果str中包含字符“*”,则替换成字符str2

并用函数返回目标转换后的指针。

●找出字符串中最长的单词。

●统计字符串中单词个数。

●拼接两个字符串后,将字符串中的字符排序。

●用字符串模拟的一维数组集合运算,加入元素,删除元素。

●用字符串模拟的一维数组集合运算,求两个集合的交集。

●函数char*TrimRight(char*des,char*str)实现的功能是:

去掉字符串str最后面的空格或者不可打印字符,结果存入des,并返回该指针。

简45题讲

●字符指针数组元素指向字符串

Ø函数voidfun(char*str[],intlen,char*des)实现将长度为len的字符串数组str,压缩到一个字符串des中。

例如:

char*str[]=

{

“abc”,

“def”,

“ghi”,

“jk”

}

则最后程序输出:

abcdefghijk程序

Ø将字符串中的单词取出,存入一维指针数组各个指针指向的动态空间。

Ø字符指针数组指向的5个字符串排序。

见教材例9.30。

8.一维数组

●冒泡法排序,选择法排序(及其变种),插入法排序。

重要

教材P98页开始例7.7,例7.8,例7.9。

Ø变种1:

如结构体数组排序(比较的是结构体成员,交换的是结构体元素)

Ø变种2:

下标为奇数(或偶数)的元素排序;下标每隔m个元素排序。

Ø变种3:

按指定条件排序。

例如:

数组按后三位数字的大小排序。

对于两个整数2178和3088,如果按后三位数字的大小排升序,结果是排3088在2178之前。

例如,对数组:

{41,18467,6334,26500,19169}的排序结果是:

{41,19169,6334,18467,26500}程序

●一维数组插入元素,删除元素,

Ø函数intfun(intA[],intlen,intt)实现将t插入到已经由大到小排序的数组中,并返回数组插入数据后的长度。

如果数据已经存在,则不插入,返回len即可。

插入一个元素。

Ø将素数放在数组元素前面,其他的放后面。

Ø函数intfun(intn)实现由n个人围成一圈,由第一个人开始数数,从1开始数到3的人退出,然后再从1开始,函数返回最后一个退出圈的人的编号。

Ø将数组中相同元素放在一起,并保持它们在数组中第一次出现时的相对位置。

如:

原数组:

{3,5,3,7,9,5,5}

结果数组:

{3,3,5,5,5,7,9}

Ø压缩有序数组,使相同数只保留一个,并返回不同的元素个数。

如:

{1,2,4,4,5,5,5,7,7,7,8,8,9}结果为{1,2,4,5,7,8,9},不同元素个数为7个。

Ø函数voidfun(char*str)实现把str中重复的字符删除,只余下一个,若字符出现超过一次,则在这个字符后追加字符的重复次数。

例如:

str=“abcccddeffgggg”

则:

str将被转换成abc3d2ef2g4简93题讲

●元素查找

Ø用顺序查找法在整型数组(或字符数组)中查找任意一个整数(或字符c)所在位置的下标。

教材例7.11

Ø用二分法在已排序整型数组(或字符数组)中查找任意一个整数(或字符c)所在位置的下标。

教材例7.12

●两个有序数组合并成第3个有序数组(归并算法)。

Ø合并两个升序数组,相同数只保留一个。

●最大值、最小值问题

Ø求两个一维数组对应元素之和的最大值和最小值。

Ø将一维数组中最大元素与最小元素互换。

Ø求一维数组最大元素值及其下标,最大元素值作为函数返回值,下标通过指针参数带回到主函数。

●函数fun(intA[N],intn)实现的功能是将具有N个元素的一维数组中的元素重新排列。

方法是:

给定n,下标为i的元素与下标为(i+n)%N的元素交换。

从下标0开始,交换N次,则最后的内容为排序后的结果。

●函数intfun(intarray[],intcmp,intlen)的功能是在长度为len的数组array中,查找大于cmp的数并返回大于cmp的所有数的和。

●函数intfun(intA[],intlen)返回数组中大于所有数平均值的元素的个数。

●函数intfun(intnumber)将长度为3的数字的各位从大到小排序,并返回排序后的结果。

例如输入354,返回543。

(磁力数中的部分算法)

算法1:

将各位分解到数组,排序后组合。

算法2:

硬性分解到三个整型变量中,交换数值排序,再组合。

●将一维数组循环右移或左移。

函数intfun(intA[],intlen,intm)实现将数组中各元素向后循环移动m位。

例如:

A[]=1,5,6,7,8,8,10,15,4m=3

则A[]=10,15,4,1,5,6,7,8,8

●筛选法求素数。

教材P102例7.10

●求fibonacci数列前len个数,存入数组,输出。

●将数组a看成循环数组,产生新数组b,b数组元素的值为a数组对应元素前后连续三个元素的平均值

●结构体数组,找出排名前m位的学生。

●函数intfun(intA[],intlenA,intB[],intlenB)实现两个超大数的相加。

数据的存储方式是:

下标为0表示个位,下标为1表示十位,依此类推。

lenA和lenB表示当前的位数。

返回相加之和的数据的位数。

例如:

A中存储1234567

B中存储2344132

则相加之和为3578699,返回7

9.有关一维数组的数值计算题

●求一维数组均方差。

均方差的计算公式为:

其中平均值为

●一维数组计算,∑求和计算,∏求积计算。

10.二维数组

●对角线元素

Ø求n×n矩阵的对角线数值的平方和

●周边元素

Ø周边元素之和。

Ø将二维数组周边元素置为2,中间元素均置为0。

●二维数组排序,实际上按一维数组排序。

●找出二维数组的鞍点,该元素所在行中最大,列中最小。

●移动行列元素

Ø将二维数组最右一列移至最左一列

Ø将二维数组最右边的n列循环移至最左边

Ø将二维数组第一行循环移至最后一行

●二维数组转置

●二维数组每行元素均逆置,每列元素均逆置。

程序

●二维数组中最小值与左上角元素对调,最大值与右下角元素对调。

●将二维数组中最小元素所在的行删除

●求矩阵中所有质数之和。

●统计二维数组中正数、负数和零的个数。

●求出M行N列二维数组每行元素中的最小值,并计算它们的和值。

和值通过形参(指针)传回到主函数。

●N行N列的矩阵中,每行都有最大的数,本程序求这n个最大数中的最小的一个,并作为函数的返回值。

程序

●函数doublefun(doubleA[5][5])返回二维数组中大于本行平均数的所有数之和。

●求二维数组每列(行)元素平均值,并存放到另一个一维数组中。

●折叠方阵,二维数组

●螺旋方阵

●魔方阵:

是指这样的一种奇数阶方阵,它的每一行、每一列以及对角线之和均相等。

●二维数组旋转

Ø二维数组向右旋转90度

Ø二维数组向左旋转90度

下标a[i][j]b[ii][jj]

ii=N-1-j,jj=i

●矩阵下三角元素压缩到一维数组中。

例如,矩阵A为

,其下三角矩阵为

如果以行顺序存储下三角部分的元素,则矩阵A可存储为一维数组:

{1,3,4,5,4,3,7,6,8,9}。

另外,假设以一维数组B(该数组的大小为n*(n+1)/2作为n阶对称矩阵A的压缩存储结构,则矩阵A的元素a[i][j]和一维数组元素B[k]之间的下标换算关系为:

k=(i+1)*i/2+j。

算法:

一次扫描二维数组下三角元素,按公式k=(i+1)*i/2+j将a[i][j]元素存放到B[k]元素中。

程序

11.数学中数值计算题(必须看!

!

!

●求积分

Ø梯形法求积分,见教材例9.35

Ø矩形法求积分,见C++实验指导书P92

●解方程

Ø弦截法解方程,见教材例5.11

Ø二分法解方程,见C++实验指导书P91

Ø牛顿迭代法,见C++实验指导书P91

12.面向对象部分(运算符重载,友元函数)

●定义矩阵类,使用运算符重载技术实现两个矩阵的相加。

如定义矩阵A=

和B=

通过运算C=A+B,得到结果矩阵C=

程序

●分数类,重载两个分数的+-运算,求最大公约数算法。

Ø建立分数类fraction,用于表示最简分数。

最简分数为分子和分母没有公约数的分数。

该分数类重载运算符+和-,分别实现两个分数的加法和减法。

程序

●定义一个点point类,定义其友元函数求两点之间的距离。

●点类、线类定义,友元函数,求点到线的距离。

13.文件

●调用函数WriteFile(char*str)将得到的结果字符串写入文件。

●函数intfun(char*filename)以只读方式打开文件,以循环方式判定文件的长度

●函数voidfun(charc)实现把从键盘输入的字符c追加到文件abc.txt尾部。

14.链表(全国考试的同学不看,江苏考试的同学另找时间讲)

●构造降序链表,插入不相同元素;

删除节点,节点遍历。

综合第6题(三个算法)

●函数voidfun(Node*head1,Node*head2)将链表head2链接在head1的后面。

15.队列(线性表)

●函数voidfun(Node*head,intdata)产生一个节点,节点中存入数据data,然后把节点加入到队列中。

程序为了方便,提供了一个辅助节点,其内不存储数据。

备注:

加入到队列尾。

简87题讲

16.堆栈

17.系统函数

●求随机数、设置随机数种子、时间处理函数

18.指向函数的指针(一般只要看懂即可)

====================================

素数算法

intisprime2(intx)

{

intk,i;

k=sqrt(x);

for(i=2;i<=k;i++)

if(x%i==0)return(0);

return

(1);

}

素数算法结束

公约数公倍数算法

intgys(intm,intn)//用辗转相除法求最大公约数

{

intd,x,u;

d=m>n?

m:

n;

x=m

m:

n;

u=d%x;

while(u!

=0)

{d=x;x=u;u=d%x;}

return(x);

}

intgys(intm,intn)//用辗转相除法求最大公约数的优化算法

{//所谓优化是指,不需要求m、n的最大值

intr;

while((r=m%n)!

=0)

{m=n;n=r;}

return(n);

}

intgbs(intm,intn)//求最小公倍数

{

intmaxy;

maxy=gys(m,n);

return(m*n/maxy);

}

intgys(intm,intn)//根据定义求最大公约数

{

inti,x;

x=m

m:

n;

for(i=x;i>=1;i--)

if(m%i==0&&n%i==0)break;

return(i);

}

intgbs(intm,intn)//根据定义求最小公倍数

{

inti,d;

d=m>n?

m:

n;

for(i=d;i<=m*n;i++)

if(i%m==0&&i%n==0)break;

return(i);

}

intgys(intm,intn)//求最大公约数:

大数减小数直至两数相等

{

while(m!

=n)

if(m>n)m=m-n;

elsen=n-m;

return(m);

}

voidmain()

{

intm,n;

cin>>m>>n;

cout<<"gongyueshu:

"<

cout<<"gongbeishu:

"<

}

公约数公倍数算法结束

简54题讲

函数fun(intn)完成的功能是将n分解为质数的积的形式。

如90=2*3*3*5。

voidfun(intn)

{

for(inti=2;i<=n;i++)

{

while(n!

=i)

if(n%i==0)//第一个能把n除尽的i一定是质数。

{

cout<

n=n/i;//连续用i去除n

}

else

break;

}

cout<

}

变化,将质因数分解到数组中。

#include

intfun(intn,inta[])

{

intj=0;

for(inti=2;i<=n;i++)

{

while(n!

=i)

if(n%i==0)

{

a[j++]=i;//将i存放到一个一维数组中

n=n/i;

}

else

break;

}

a[j++]=n;

returnj;

}

voidmain(void)

{

inta[100],n;

n=fun(90,a)

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

当前位置:首页 > PPT模板 > 自然景观

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2