C++常用算法.docx
- 文档编号:24533747
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:51
- 大小:98.26KB
C++常用算法.docx
《C++常用算法.docx》由会员分享,可在线阅读,更多相关《C++常用算法.docx(51页珍藏版)》请在冰豆网上搜索。
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文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 常用 算法