C语言趣味题
关于此书
第一章-最简单的问题与算法
1.绘制余弦曲线
2.绘制余弦曲线和直线
3.绘制圆
4.歌星大奖赛
5.求最大数
6.高次方数的尾数
7.阶乘尾数零的个数
8.借书方案知多少
9.杨辉三角形
10.数制转换
第二章-生活中的数学问题
11.打鱼还是晒网
12.抓交通肇事犯基础c语言代码
13.该存多少钱
14.怎样存钱利最大
15.捕鱼和分鱼
16.出售金鱼
17.平分七筐鱼
第三章-整数趣题
18.有限5位数
19.8除不尽的自然数
20.一个奇异的三位数
21.4位反序数
22.求车速
23.由两个平方三位数获得三个平方二位数
24.阿姆斯特朗数
25.完全数
26.亲密数
27.自守数
28.回文数
29.求具有abcd=(ab+cd)*(ab+cd)性质的四位数
第四章-素数的家族
30.求素数
31.歌德巴赫猜想
32.可逆素数
33.回文素数
34.要发就发
35.素数幻方
第五章-不定方程求整数解
36.百钱百鸡问题
37.爱因斯坦的数学题
38.换分币
39.年龄几何
40.三球问题
41.马克思手稿中的数学题
第六章-分数趣题
42.最大公约数和最小公倍数
43.分数比较
44.分数之和
45.将真分数分解为埃及分数
46.列出真分数序列
47.计算分数的精确值
第七章-逻辑推理与判断
48.新娘和新郞
49.委派任务
50.谁在说谎
51.谁是窃贼
52.黑与白
53.谜语博士的难题(1)
54.谜语博士的难题(2)
55.哪个大夫哪天值班
56.区分旅客国籍
57.谁家孩子跑最慢
第八章-数字0到9的奇妙变化
58.拉丁方阵
59.填表格
60.用1到9组成3个3位数,且三者之比为1:2:3
61.1-9组成三个3位的平方数
62.由8个整数形成奇特的立方体
63.减式还原
64.乘式还原(1)
65.乘式还原(2)
66.除式还原(1)
67.除式还原(2)
68.九位累进可除数
第九章-数的变换
69.魔术师的猜牌术(1)
70.魔术师的猜牌术(2)
71.约瑟夫问题
72.邮票组合
73.和数能表示1-23的5个正整数
74.可称1-40磅的4块砝码
75.10个小孩分糖果
76.小明买书
77.波松瓦的分酒趣题
第十章-定理与猜想
78.求π的近似值(1)
79.求π的近似值(2)
80.奇数平方的一个有趣性质
81.角谷猜想
82.四方定理
83.卡布列克常数
84.尼科彻斯定理
85.回文数的形成
第十一章-智力游戏
86.自动发牌
87.青蛙交换
88.常胜将军
89.抢30
90.搬山游戏
91.人机猜数游戏(1)
92.人机猜数游戏(2)
93.汉
诺塔
第十二章-其他趣味程序
94.兔子产子
95.将阿拉伯数字转换为罗马数字
96.选美比赛
97.满足特异条件的数列
98.八皇后问题
99.超长正整数的加法
100.数字移动
《C语言趣味程序百例精解》CHM V1.0
ABC Amber CHM Converter 7.19
Trial version
原书作者:陈朔鹰,陈英
出版社:北京理工大学出版社
电子书版本号:V1.0
完成时间:2007年9月
电子书作者:cool8jay
E-Mail:cool8jay@qq
讨论论坛:cfun.5d6d(近期不支持游客浏览,见谅)
本电子书所有代码均在Windows XP SP2,Microsoft Visual C++ 6.0环境下测试通过。
在电子书制作过程中,本人得到了CSDN以下网友的热心帮助,特此感谢!
他们是gfxiang,lihui_shine,raincatss。
如果发现任何错误,包括错别字,程序问题,请立即指出,以便修正。
书中有一些题目尚未完全解答出来,恳请高手指点。
2.绘制余弦曲线和直线
16.出售金鱼 思考题
35.素数幻方 思考题
44.分数之和 思考题
46.列出真分数序列 思考题
47.计算分数的精确值 思考题
55.哪个大夫哪天值班 思考题
61.1-9组成三个3位的平方数 思考题
62.由8个整数形成奇特的立方体 思考题
65.乘式还原(2) 思考题
68.九位累进可除数 思考题
76.小明买书 思考题
77.波松瓦的分酒趣题 思考题
87.青蛙交换 思考题
88.常胜将军 思考题
89.抢30 思考题
90.搬山游戏 思考题
92.人机猜数游戏(2) 思考题
96.选美比赛 思考题
98.八皇后问题 思考题
99.超长正整数的加法 思考题
100.数字移动 思考题
1.绘制余弦曲线 在屏幕上用“*”显示0-360度的余弦函数cos(x)曲线。 *问题分析与算法设计 如果在程序中使用数组,这个问题十分简单。但若规定不能使用数组,问题就变得不容易了。 关键在于余弦曲线在0-360度的区间内,一行中要显示两个点,而对一般的显示器来说,只能按行输出,即:输出第一行
信息后,只能向下一行输出,不能再返回到上一行。为了获得本文要求的图形就必须在一行中一次输出两个“*”。 为了同时得到余弦函数cos(x)图形在一行上的两个点,考虑利用cos(x)的左右对称性。将屏幕的行方向定义为x,列方向定义为y,则0-180度的图形与180-360度的图形是左右对称的,若定义图形的总宽度为62列,计算出x行0-180度时y点的坐标m,那么在同一行与之对称的180-360度的y点的坐标就应为62-m。程序中利用反余弦函数acos计算坐标(x,y)的对应关系。 使用这种方法编出的程序短小精炼,体现了一定的技巧。 *程序代码与注释 #include #include void main() { double y; int x,m; for(y=1;y>=-1;y-=0.1) //y为列方向,值从-1到1,步长为0.1 { m=(i
nt)(acos(y)*10); //计算出y对应的弧度m,乘以10为图形放大倍数 for(x=0;x #include void main() { double y; int x,m; for(y=1;y>=-1;y-=0.1) //y为列方向,值从-1到1,步长为0.1 { m=(int)(acos(y)*10); //计算出y对应的弧度m,乘以10为图形放大倍数 for(x=0;x #include void main() { double y; int x,m; for(y=1;y>=-1;y-=0.1) { m=(int)(asin(y)*10); if(y>0) { for(x=1;x #include void main() { double y; int x,m; for(y=1;y>=-1;y-=0.1) { m=(int)(asin(y)*10); for(x=0;x
2.绘制余弦曲线和直线 在屏幕上显示0-360度的cos(x)曲线与直线f(x)=45*(y-1)+31的迭加图形。其中cos(x)图形用“*”表示,f(x)用“+”表示,在两个图形相交的点上则用f(x)图形的符号。 *问题分析与算法设计 本题可以在上题的基础上进行修改。图形迭加的关键是要在分别计算出同一行中两个图形的列方向点坐标后,正确判断相互的位置关系。为此,可以先判断图形的交点,再分别控制打印两个不同的图
形。 *程序注释与说明 #include #include void main() { double y; int x,m,n,yy; for(yy=0;yy #include void main() { double y; int x,m,n; for(y=1;y>=-1;y-=0.1) { m=(int)(asin(y)*10); n=(int)(acos(y)*10); for(x=0;x
3.绘制圆 在屏幕上用“*”画一个空心的圆。 *问题分析与算法设计 打印圆可利用图形的左右对称性。根据圆的方程: R*R=X*X+Y*Y 可以算出圆上每一点行和列的对应关系。 *程序说明与注释 #include #include void main() { double y; int x,m; for(y=10;y>=-10;y--) { m=(int)(2*sqrt(100-y*y)); //计算行y对应的列坐标m,2是屏幕纵横比调节系数因为屏幕的行距大于列距,不进行调节显示出来的将是椭圆 for(x=1;x #include void main() { double y; int x,m; for(y=10;y>=-10;y--) //对于第一个y坐标进行计算并在一行中打印图形 { m=30+(int)(2*sqrt(100-y*y)); for(x=0;x #include void main() { double y; int x,m,n; for(y=10;y>=-10;y--) //对于第一个y坐标进行计算并在一行中打印图形 { m=30+(int)(2*sqrt(100-y*y)); if ((int)y>=0) n=30+(int)(2*sqrt(y)); else n=-1; //y=0时,n=30被留下来,会影响图形,故做此处理 for(x=0;x
4.歌星大奖赛 在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1-100分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。 *问题分析与算法设计 这个问题的算法十分简单,但是要注意在程序中判断最大、最小值的变量是如何赋值的。 *程序说明与注释 #include #include void main() { int i,a,min=100,max=0,sum=0; float aver; for(i=0;ia) min=a; if(ma
x #include void main() { int i,a[10],min=100,max=0,sum=0,just,unjust; double aver; for(i=0;ia[i]) min=a[i]; if(maxfabs((double)(unjust)-aver)) unjust=a[i]; if(fabs((double)a[i]-aver)
5.求最大数 问555555的约数中最大的三位数是多少? *问题分析与算法设计
根据约数的定义,对于一个整数N,除去1和它自身外,凡能整除N的数即为N的约数。因此,最简单的方法是用2到N-1之间的所有数去除N,即可求出N的全部约数。本题只要求取约数中最大的三位数,则其取值范围可限制在100到999之间。 *程序说明与注释 #include #include void main() { int i,j; long a; printf("Input a integer that is greater than 100:\n"); scanf("%ld",? if (a
6.高次方数的尾数 求13的13次方的最后三位数。 *问题分析与算法设计 解本题最直接的方法是:将13累乘13次方截取最后三位即可。 但是由于计算机所能表示的整数范围有限,用这种“正确”的算法不可能得到正确的结果。事实上,题目仅要求最后三位的值,完全没有必要求13的13次方的完整结果。 研究乘法的规律发现:乘积的最后三位的值只与乘数和被乘数的后三位有关,与乘数和被乘数的高位无关。利用这一规律,可以大大简化程序。 *程序说明与注释 #include #include void main() { int x,y,i,last=1; printf("Input X and Y(X**Y):"); scanf("%d**%d",? for(i=0;i
7.阶乘尾数零的个数 100!的尾数有多少个零? *问题分析与算法设计 可以设想:先求出100!的值,然后数一下末尾有多少个零。事实上,与上题一样,由于计算机所能表示的整数范围有限,这是不可能
的。 为了解决这个问题,必须首先从数学上分析在100!结果值的末尾产生零的条件。不难看出:一个整数若含有一个因子5,则必然会在求100!时产生一个零。因此问题转化为求1到100这100个整数中包含了多少个因子5。若整数N能被25整除,则N包含2个因子5;若整数N能被5整除,则N包含1个因子5。 *程序说明与注释 #include #include void main() { int a,count =0; for(a=5;a #include void main() { int a,i,b,j=0,count =0; printf("Input an integer:\n"); scanf("%d",? for (i=1;(int)(pow(5,i))0;j--) //循环次数较少的放外层 { for(b=a;b>0;b-=1) //步长也要修改 { if(!(b%((int)(pow(5,j))))) ++count; } } printf("The number of 0 in the end of %d! is: %d.\n",a,count); }
8.借书方案知多少 小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法? *问题分析与算法设计 本问题实际上是一个排列问题,即求从5个中取3个进行排列的方法的总数。首先对五本书从1至5进行编号,然后使用穷举的方法。假设三个人分别借这五本书中的一本,当三个人所借的书的编号都不相同时,就是满足题意的一种借阅方法。 *程序说明与注释 #include #include void main() { int a,b,c,count=0; printf("There are diffrent methods for Xiao Ming to distribute books to 3 readers:\n"); for(a=1;a #include void main() { int i,j,k,count=0; printf("There are diffrent methods for Xiao Ming to distribute bo
oks to 3 readers:\n"); for(i=1;i
9.杨辉三角形 在屏幕上显示杨辉三角形 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 …………………………… *问题分析与算法设计 杨辉三角形中的数,正是(x+y)的N次方幂展开式各项的系数。本题作为程序设计中具有代表性的题目,求解的方法很多,这里仅给出一种。 从杨辉三角形的特点出发,可以总结出: 1)第N行有N+1个值(设起始行为第0行) 2)对于第N行的第J个值:(N>=2) 当J=1或J=N+1时:其值为1 J!=1且J!=N+1时:其值为第N-1行的第J-1个值与第N-1行第J个值之和 将这些特点提炼成数学公式可表示为: 当x=1或x=N+1时,c(x,y)=1 当x=其他时,c(x,y)=(x-1,y-1)+c(x-1,y) 本程序应是根据以上递归的数学表达式编制的。 *程序说明与注释 #include void main() { int c(int x,int y); int i,j,k,n=13; //这里n必须初始化为一个比12大的整数,否则下面的判断失败 printf("Input a integer less than 13,N="); while(n>12) //判断输入数据是否超过12 { scanf("%d",? //控制输入正确的值以保证屏幕显示的图形正确 if(n>12) printf("Input a integer less than 13,N="); } for(i=0;i void main() { int fac(int x); int i,j,k,n=13; //这里n必须初始化为一个比12大的整数,否则下面的判断失败 printf("Input a integer less than 13,N="); while(n>12) //判断输入数据是否超过12 { scanf("%d",? //控制输入正确的值以保证屏幕显示的图形正确 if(n>12) printf("Input a integer less than 13,N="); } for(i=0;i=1;x--) s=s*x; //若为x行的第1或第x+1列,则输出1 return s; }
10.数制转换 将任一整数转换为二进制形式。 *问题分析与算法设计 将十进制整数转换为二进制的方法很多,这里介绍的实现方法利用了C语言能够对位进行操作的特点。对于C语言来说,一个整数在计算
机内就是以二进制的形式存储的,所以没有必要再将一个整数经过一系列的运算转换为二进制形式,只要将整数在内存中的二进制表示输出即可。比如,数字14的二进制表示为00000000000000000000000000001110,先用10000000000000000000000000000000与它进行与运算,判断第32位是否为1,依次下去,判断第31位,第30位,…………,计算到第4位时,与运算结果为00000000000000000000000000001000,表示数字14的二进制形式在该位为1,然后,把与运算的结果右移3次,使之得到结果1,再加上0的ASC值,结果为49,即1的ASC值,putchar()输出1。这样实现从高位到低位的二进制输出。 *程序说明与注释 #include void main() { void printb(int,int); int x; printf("Input number:"); scanf("%d",? printf("number of decimal form:%d\n",x); printf("it's binary form:"); printb(x,sizeof(int)*8); //x:整数,sizeof(int):int型在内存中所占的字节数,sizeof(int)*8:int型对应的位数 putchar('\n'); } void printb(int x,int n) {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论