专升本C++复习题Word文档格式.docx
《专升本C++复习题Word文档格式.docx》由会员分享,可在线阅读,更多相关《专升本C++复习题Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
![专升本C++复习题Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/25/079a57e2-0cf9-4075-bd89-019eccc71b46/079a57e2-0cf9-4075-bd89-019eccc71b461.gif)
求最大公约数的方法有两种:
第一种方法:
穷举法
(1)、比较x、y中较小的值取出来,放到div中
(2)、div到1之间,如果有被x和y整除的数,则这个数就是最大公约数。
第二种方法:
辗转相除法
(1)、对于已知两数x、y,先比较x和y的大小,使得x>
y
(2)、x除以y得余数,即r=xmody;
(3)、若余数r=0,则y为求得的最大公约数,循环结束;
否则执行第(4)步。
(4)、x=y,y=r,重复执行第
(2)步
求56和17的最大公约数。
56除以16得余数8,8不为零;
所以继续16除以8得余数0;
余数为0,因此8为最大公约数。
五、输出图形题
15、输入整数n,输出n行的如下图案:
*
**
***
****
*****
******
*******
********
16、输入整数n,输出n行的如下图案:
*
***
*****
*******
*********
17、输入奇数n(9>
=n>
=1),输出n行的如下图案(以输入9为例):
1
222
33333
4444444
555555555
6666666
77777
888
9
18、输入奇数n,输出n行的如下图案:
**
**
六、字母译码
20、(循环译码)编写程序,实现对任意字符串的加密操作。
其中,对大小写字母的加密规则为:
A——>
D,B——>
E,C——>
F……M——>
P,N——>
Q,X——>
A,Z——>
C。
a——>
d,b——>
e,c——>
f……m——>
p,n——>
q,x——>
a,z——>
c
要求:
输入一行电文,将其中的字母字符号进行加密,其他字符不变。
加密后,在下一行输出。
21、(对称译码)有一行电文,按下面规律进行加密:
A->
Za->
z
B->
Yb->
y
C->
Xc->
x
……
即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母。
非字母字符不变。
要求编写程序进行相应的加密操作。
七、递推公式
22、猴子吃桃:
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半加一个。
到第n天早上想再吃时,只剩下一个桃子了。
求第一天共摘了多少。
输入一个n的值,求桃子总数。
23、一对兔子从出生后第3个月起每个月都生一对兔子。
小兔子到第3个月又生一对兔子。
假设所有兔子都不死,求第n个月的兔子对数,并输出。
(N由键盘输入)(要求:
在主函数中从键盘输入n的值,用函数intFib(intn),求解第n个月的兔子数,并将计算的兔子数返回给主函数,由主函数输出)
九、求方程的根和定积分:
24、用迭代法求x=a1/2。
求平方根的迭代公式为xn+1=1/2(xn+a/xn),要求前后两次求出的x的差的绝对值小于10-5。
用迭代法求平方根的算法:
(1)设定一个x的初值x0=a/2;
(2)用以上公式求出x的下一个值x1;
(3)再将x1代入以上公式的右侧的xn,求出x的下一个值x2;
(4)如此继续下去,直到前后两次求出的x的值(xn和xn+1)满足以下关系:
|xn+1-xn|<
10-5
25、求方程ax2+bx+c=0的根,用3个函数分别求当b2-4ac大于零、等于0和小于0时的根,并输出结果。
从主函数输入a,b,c的值。
26、用牛顿迭代法求方程的根。
方程为ax3+bx2+cx+d=0。
系数a,b,c,d的值依次为1,2,3,4,由主函数输入。
求x在1附近的一个根。
求出根后由主函数输出。
牛顿迭代法的公式是x=x0-f(x)/f”(x),设迭代到|x-x0|<
=10-5时结束。
用牛顿迭代法求根的函数的算法如下:
do
{x0=x;
计算f(x0)的值
计算f(x0)的导数f’(x0)的值
计算近似根x=x0-f(x0)/f’(x0)
}until(|x-x0|<
=10-5)
输出近似根x
27、使用矩形法分别求∫01sinxdx的定积分。
十、素数
28、编写函数boolprime(intn),判断n是否是素数,如果是返回true,否则返回false。
29、编写程序验证歌德巴赫猜想:
一个不小于6的偶数可以表示为两个素数之和,如6=3+3,8=3+5....(其中判断某个数是否为素数,使用上面的函数)
30、由用户输入p和m,求[p,m]范围以内的所有素数。
分别采用两种方法求解,
(1)、普通方法;
(2)、筛选法
筛选法找素数的思想:
首先把2到m内所有数放到筛中,然后选取当前的最小数2,将筛内的所有2的倍数都去掉;
在选取下一个数3,将筛内的所有3的倍数都去掉;
再选取下一个数5(4为2的倍数,已经去掉),将筛内的所有5的倍数都去掉,依次进行,直到超出m的范围为止。
剩下的数就是2到m间所有的素数,可以从中取得p到m之间的素数。
十一、排序
31、冒泡排序(BubbleSorting)的基本思想是:
设待排序n个元素存放在数组a[n]中,无序区范围初始为(a(0),a
(1),a
(2),...,a[n-1]),冒泡排序方法是在当前无序区内,从最上面的元素a[0]开始,对每两个相邻的元素a[i+1]和a[i](i=0,1,...,n-1)进行比较,且使值较小的元素换至值较大的元素之上(若a[i]>
a[i+1],则a[i]和a[i+1]的值互换),这样经过一趟冒泡排序后,假设最后下移的元素为a[k],则无序区中值较大的几个元素到达下端并从小到大依次存放在a[k+1],a[k+2],...a[n-1]中,这样无序区范围变为(a[0],a[1],a[2],...,a[k])。
在当前无序区内进行下一趟冒泡排序。
这个过程一直到某一趟排序中不出现元素交换的动作,排序结束。
整个排序过程最多执行n-1遍。
这种排序方法是通过相邻元素之间的比较与交换,使值较小的元素逐渐从后部移向前部(从下标较大的单元移向下标较小的单元),就象水底下的气泡一样逐渐向上冒。
故称为冒泡排序法。
给定10个数,放入数组中,使用冒泡排序法由小到大排序后输出。
32、选择排序的基本思想:
1)从n个数中选择最小的一个,把它和第一个数组元素交换;
2)从剩下的n-1个数中选择最小的一个,把它和第二个数组元素交换;
3)依此类推,直到从最后两个元素中选出倒数第二小的元素并把它和倒数第二个元素交换为止。
如要按选择排序法对数组3050213920排序,则各趟排序后的结果如下所示(带下划线的数表示参加交换的数):
开始:
3050213920
第一趟排序:
2050213930
第二趟排序:
2021503930
第三趟排序:
2021303950
第四趟排序:
给定10个数,放入数组中,使用选择排序法由小到大排序后输出。
33、直接插入排序(InsertionSort)
基本思想:
将n个元素的数列分为已有序和无序两个部分。
每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。
Step1从有序数列{a1}和无序数列{a2,a3,…,an}开始进行排序;
Step2处理第i个元素时(i=2,3,…,n),数列{a1,a2,…,ai-1}是已有序的,而数列{ai,ai+1,…,an}是无序的。
用ai与ai-1、ai-2,…,a1进行比较,找出合适的位置将ai插入。
Step3重复Step2,共进行n-1的插入处理,数列全部有序。
34、归并就是将两个有序表合并成一个有序表的过程。
如两个有序表(7,12,15,20)和(4,8,10,17),归并后得(4,7,8,10,12,15,17,20)
35、给出n(1<
=n<
10000)个正整数,n为奇数,请对这n个数进行排序,找到中间的数字并输出。
输入:
第1行:
一个奇数n;
第2到n+1行:
每行包含一个正整数。
输出:
输出中间的数
36、对数组a中的a[0]~a[n-1]这n个元素进行排序。
排序过程如下:
第一趟对所有的偶数下标p,比较a[p]和a[p+1],若a[p]>
a[p+1],则将两者交换;
第二趟对所有的奇数下标q,比较a[q]和a[q+1],若a[q]>
a[q+1],则将两者交换:
第三趟对偶数下标,第四趟对奇数下标,……,依次类推,直至整个数组元素有序排列为止。
十二、查找、删除和插入某个指定的数
37、写一个函数,用二分法(折半法)在已按从小到大排序的整型数组list[](数组包含len个元素)中查找一个整数n,若n在数组中,函数返回数n在数组中的下标;
否则返回-1。
所谓二分法查找是:
初始查找区间的下界为0,上界为len-1,查找区间的中间元素下标为k=(下界+上界)/2;
若list[k]等于n,查找成功;
若list[k]>
n,则新的查找区间的下界不变,上界改为k-1;
否则新的查找区间的下界改为k+1,上界不变。
在新区间内继续用二分法查找。
38、随机产生15个值为[100,200]的整数存于数组中,输入一个数后,在数组中用顺序查找法查找该数,并删除数组中所有与该数相同的数。
39、有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。
输入
先输入n(2<
=10),表示一维数组的大小。
按从小到大输入数组n个元素的值。
(假设为整型数)
再输入要插入的值
输出
输出插完数后的数组值。
输出在一行内(以空格分隔每个数)
十三、其他有关一维数组的处理
40、输入n个元素的数组,删除其中所有相同的数,只保留第一个相同的数,并输出。
如输入8个元素的数组{3,2,5,7,1,2,4,7},删除后变为{3,2,5,7,1,4}。
41、将一个数组中的值按逆序重新存放。
例如,原来顺序为8,6,5,4,1。
要求改为1,4,5,6,8。
=100),表示一维数组的大小。
再输入数组n个元素的值。
输出逆序值。
42、有n个人围成一圈,顺序排号。
从第1个人开始报数(从1~3报数),凡报到3的人退出圈子,问最后留下的人原来排在第几号。
输入n,为整数(n<
=10000)。
输出最后留下的人原来排的号码。
如输入10,则输出为4。
43、编一程序,输入月份号,输出该月的英文月名。
例如、输入“3”,则输出Match,要求用数组储存以下数据。
January,February,Match,April,May,June,July,August,September,October,November,December。
输入一个数字n(1<
=12)。
输出月份的英文单词。
44、输入一行字符串,内有数字和非数字字符(包括空格),如:
a123x456,1768?
0302tab5876
将其中连续的数字作为一个整数,依此存放到一数组a中。
例如,123放在a[0],456放在a[1]……统计共有多少整数,并输出这些数。
输入一个字符串(字符个数不超过200个),内含整数个数不超过50个。
输出整数个数,占一行;
输出这些整数,每个一行;
如输入为:
a123x456,1768?
0302tab5876
则输出:
5
123
456
1768
302
5876
45、有n个整数,循环向右移动m位后,输出结果。
如:
5个元素的数组:
12345,循环向右移动1位后,为51234;
若循环向右移动2位后,为45123。
循环移位功能在函数voidmove(inta[],intn,intm)中实现)
输入n(n<
=200),m两个整数,占一行。
接着输入n个整数。
输出循环移位后的结果,占一行。
十四、二维数组
46、有一个n×
m的矩阵,要求编程序求出:
每行元素的最大值,以及其所在的行号和列号。
求出所有元素的最大值,以及其所在的行号和列号。
先输入n,m(2<
=100,2<
=m<
=100)
在输入矩阵中各元素的值。
先输出每行元素的最大值的下标及其值,每个占一行;
再输出所有元素的最大值的下标及其值。
47、有一个n×
n的矩阵,求正对角元素的和及反对角元素的和、矩阵的转置。
48、8位选手参加百米决赛,选手号码及参赛成绩保存在二维数组sz中,编程实现按升序输出7位选手号码及成绩。
49、打印以下杨辉三角形。
1
11
121
1331
14641
15101051
......
输入n(1<
N<
=10),表示杨辉三角形的行数。
输出n行杨辉三角形。
要求每5格输一个数,数字右对齐。
50、找二维数组的鞍点,即该位置上的元素在该行上最大,在该列上最小(也可以没有鞍点)。
=100,2<
若有鞍点,输出所有鞍点的行和列及其值,每个占一行。
若没有鞍点,则输出"
no"
,占一行
51、二维数组循环右移动:
如3x4的二维数组循环向右移动2位。
1234
5678
1357
循环移动后为:
3412
7856
5713
先输入n,m(1<
=100,1<
m<
="
100)"
再输入矩阵中各元素的值。
最后输入循环移动的位数。
输出循环移动位后矩阵中各元素的值。
52、有一个班n个学生,5门课程。
1)、输入n个学生的学号和5门课的成绩;
2)、求5门课程的平均分;
3)、找出有两门以上课程不及格的学生,输出他们的学号、全部课程成绩;
4)、找出全部课程成绩在85分或85分以上的学生的学号。
(学生的记录由学号和5门课成绩组成,学生用结构体表示)
十五、有关进制问题
53、将十进制转换成二进制、八进制或十六进制。
54、对8位二进制整数求补的算法。
该算法的计算过程如下:
从二进制数的低位(最右位)开始,依次向高位逐位查看,之到首次遇到“1”时,停止查看。
然后,对该“1”位左面的更高位(如果有的话),逐位求反,所得的结果就是对原二进制数求补的结果。
对二进制整数10101000求补的结果是01011000。
设8位二进制整数中的各位,从低位到高位,依次存放在整型数组BIT的BIT[1]——BIT[8]中。
例如,二进制整数10101000存放在数组BIT后,就有BIT[1]=0,Bit[2]=0,……,Bit[7]=0,Bit[8]=1。
十六、函数
55、计算a!
+b!
+c!
+d!
的值。
用一个函数fac(n)计算n!
。
a、b、c、d的值由主函数输入,最终的值由主函数输出。
输入一行,包含a、b、c、d,以空格分隔。
输出的计算结果占一行。
56、计算从n个人中选k个人组成委员会的不同组合数。
(利用函数计算n!
)
分别输入n和k。
输出组合数,占一行。
57、编一个程序,在主函数中输入10个英文单词,用另一个函数对它们按字典顺序排序,然后在主函数中输出这10个已排好序的单词。
58、输入两个集合,分别存放在两个数组中。
如a={3,2,1,4,5};
b={3,5,8,6,9};
a和b的并集为c={1,2,3,4,5,6,8,9};
a和b的交集为d={3,5};
(要求用指向数组元素的指针变量处理;
编写voidmerge(intaz[],intbz[],intn,intm)函数,完成交集功能;
编写voidsession(intaz[],intbz[],intn,intm)函数,完成交集功能。
)
先输入n,表示集合a的元素个数;
(1<
输入集合a的n个元素值(为整数,无重复值);
输入m,表示集合b的元素个数;
M<
输入集合b的n个元素值(为整数,无重复值)。
先按从小到大的顺序输出并集中的各元素值,占一行;
再按从小到大的顺序输出交集中的各元素值,占一行。
59、将字符串交叉插入到另一个字符串中。
“abcde”和“ABCDEFG”;
插入后变成“aAbBcCdDeEFG”。
输入两行字符串(字符个数不超过500);
输出交叉后的字符串。
十七、字符串处理
60、输入n个字符串,将其中以’A’打头的字符串输出。
=10),表示输入的字符串数,占一行。
接着输入n个字符串,每个占一行。
输出’A’打头的字符串,每个占一行。
61、找出一个英文字符串中第一个最长的英文单词,字符串中的各英文单词以一个或多个空格分隔或标点符号分隔。
如“Iamastudent.”最长英文单词为”student”。
Input
输入一串字符串。
(字符个数不超过500,含标点符号和英文字母,最长英文单词的字符数不超过20)
Output
最长单词,占一行;
输入为:
Iamlucky.studentwenttoschool.
student
62、统计一个英文字符串中英文单词的个数,字符串中的各英文单词以一个或多个空格分隔。
如“Iamastudent”英文单词个数是4。
(要求使用指针变量访问字符串中的字符)
(字符个数不超过500)
输出单词个数,占一行;
63、在一个英文字符串中查找指定英文单词出现的个数,并将该指定的单词删除。
如“Iamahappygirl,andyouareahappyboy!
”英文字符串中查找”happy”,处理完后统计出”happy”出现了2次,删除”happy”后,字符串变为”Iamagirl,andyouareaboy!
”。
64、输入一行表达式,判断该表达式中的括号是否匹配。
括号要求符合C++表达式的要求。
若左括号与右括号匹配,则输出”correct”;
否则输出“notcorrect”。
(3+(3-2))*5correct
(2+3))*4notcorrect
)2+3(notcorrect
输入一行表达式。
(字符个数不超过100个)
十八、递归问题
65、Hanoi(汉诺)塔问题。
这是一个古典的数学问题:
古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。
有一个老和尚想把这64个盘子从A座移到C座,但每次只允许移动一个盘子,且在移动过程中在3个座上都始终保持大盘在小,小盘在上。
在移动过程中可以利用B座,要求编程序打印出移动的步骤。
输入盘子个数。
输出移动的步骤,每个步骤一行。
请严格按照Sample的格式进行输出。
输入
3
A-->
C
B
C-->
B-->
A
66、请将第3、8、12、14(辗转相除法)、22、23、45、53、56题,分别用递归法求解。
十九、穷举法求解问题
67、两个乒乓球队进行比赛,各出3人。
甲队为A、B、C3人,乙队为X、Y、Z3人,已抽签决定比赛名单。
有人向队员打听比赛的名单,A说他不和X比,C说不和X、Z比。
请编写程序找出3对赛手的名单。