谭浩强第五版作为初学C语言必读的一本教材,课后习题具有非常大的参考价值,也是很多高校期末考试或者考研的重要参考。在这里我整理了一部分个人认为比较重要的编程题,供大家作参考
1.输入两个数,求他们的最大公约数和最小公倍数(最小公倍数等于两个数的乘积除上二者的最大公约数)
法一:递减法
法二:辗转相除法
辗转相除法的原理是用a除b,如果有余数,就把b赋给a,再把余数赋给b,当a除b余数为零的时候,此时的b就是二者的最大公约数,对于第一次除的时候谁做被除数是无所谓的,因为如果第一次a小于b,那么a除b的余数就是a,然后执行循环内部的操作把b赋给a,把余数赋给b,就变成了被除数大
2.计算a+aa+aaa+aaaa.....最后一项是n个a组成的数
本题关键在于如何产生每一个加数tmp。tmp=tmp*10+a即可。
3.计算1!+2!+....+10!
3.输出所有水仙花数。水仙花数指的是一个三位数,其各位数字立方和等于该数本身。
运行结果
4.如果一个数等于他的所有因子之和(因子包括1,但不包括这个数本身),这个数就被称为完数。找出1到1000内的所有完数。
5.计算分数数列前20之和(第五章第十题)
6.一个球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高。
7.猴子摘桃
8.乒乓球比赛
在找到合适的结果之后应该立马输出,没有必要再继续循环浪费时间了。
9.找1~100之内的素数
10.冒泡排序
11.求一个3×3矩阵的对角线之和
12.在一个有序数组中插入一个数
升序数组中插入一个数的思想:如果在中间插入,就把最后的元素往后挪一位,然后在原来最后一个数的位置上插入我们想要插入的数。什么叫往后挪一位呢?其实就是把最后的元素数值赋给他下一个位置
删除一个数的思想:把指定位置的元素删掉,然后后面所有元素整体往前面挪动一个位置。
13.将一个数组中的值按逆序重新存放。例如:原来顺序为8,6,5,4,1。要求改为1,4,5,6,8。
注:不要把判断条件写成p1++
14.打印杨辉三角的前十行
运行结果
杨辉三角的特点是对角线上和第一列全是1,其余位置的元素为他正上方元素与他正上方元素左边那个元素之和。比如arr[4][3]=arr[3][3]+arr[3][2]
第六章第七题魔方阵那个题就是一个找规律的题目,和代码能力没有啥关系,就不写了
15. 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点。
思路是先找出每一行的最大值,并把这个最大值所在的行记录下来,然后再去遍历这一列中的所有数找到最小值,看看这个最大值和最小值是不是同一个数,如果是,这个数所在的位置就是鞍点,同时把flag改成1,如果出了大循环之后flag还是0,说明没有鞍点
16.二分查找
17.输出一个五行的平行四边形
运行结果
18.有一行电文,以按下面规律译成密码:即第1个字母编程第26个字母,第i个字母编程第(26-i+1)个字母,非字母字符不变,要求编程序将密码译回原文,并输出密码和原文。
运行结果
str[i]-'a'表示str[i]是第几个字母吗?假如比如b-a是1,而b是第二个字母,z-a是25,而z是第26个字母,因此str[i]-'a'得到的数值表示str[i]是第str[i]-'a'+1个字母,26-(str[i]-'a')这个数值表示的是从z倒着往前数第几个字母,比如str[i]是b,然后26-((str[i]-'a'))这个数值是25,也就说b是从z倒着往前数第25个字母,而'a'+25表示'z',那么转化后的结果就成了b转化成了z,这与题目要求相比显然多加了1,因此转换的表达式应该是'a'+26-((str[i]-'a'))-1,也就是'a'+25-((str[i]-'a'))
19.模拟实现strcat
20.模拟实现strcmp
记住模拟实现strcmp的时候while循环的判断条件是*s1==*s2
21.模拟实现strcpy
22.输人一个4位数字,要求输出这4个数字字符,但每两个数字间空一个空格。如输人1990,应输出“1 9 9 0”。
运行结果为
23.写一个函数,输人一行字符,将此字符串中最长的单词输出。单词之间用空格隔开
24.写一个函数,输人一个十六进制数,输出相应的十进制数。
25.用递归法将一个整数n转换成字符串。例如,输人483,应输出字符串”483”。n的位数不确定,可以是任意位数的整数。
26.输入年月日,输出这是今年第几天
27.输入三个整数,按照从小到大的顺序输出
28.输入3个字符串,要求按由小到大的顺序输出。
比较字符串大小应该实用strcmp而不是直接用大于小于号,实际上本题的易错点在于字符串的输入,一定不要用scanf,因为scanf输入字符串的时候遇到\0会停下来,导致输出于预期不符的结果。输入字符串应该使用库函数fgets,并把第三个参数写成stdin表示从键盘读入,fgets在碰到回车的时候才会停止读取,因此能够正常的读取带空格的字符串。fgets 函数在读取到换行符 ‘\n’ 时会将其包含在读取的字符串中。换行符 ‘\n’ 会作为普通字符读入字符串,并在字符串末尾添加 ‘\0’ 字符以表示字符串的结束。
因为只有三个字符串,因此排序的方式和前一题类似。
29.输入10个整数,将其中最小的数与第一个数对换, 把最大的数与最后一个数对换。
30. 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数
31.有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
32.有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。
33.将一个5x5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下依次从小到大存放),写一函数实现之。
34. 在主函数中输入10个等长的字符串。用另一函数对它们排序。然后在主函数输出这10个已排好序的字符串。