C语言趣味程序百例精解.pptx

上传人:tia****nde 文档编号:14142010 上传时间:2020-07-06 格式:PPTX 页数:144 大小:789.20KB
收藏 版权申诉 举报 下载
C语言趣味程序百例精解.pptx_第1页
第1页 / 共144页
C语言趣味程序百例精解.pptx_第2页
第2页 / 共144页
C语言趣味程序百例精解.pptx_第3页
第3页 / 共144页
资源描述:

《C语言趣味程序百例精解.pptx》由会员分享,可在线阅读,更多相关《C语言趣味程序百例精解.pptx(144页珍藏版)》请在装配图网上搜索。

1、,一南军三军盟附啊在事自里啤,目录,1 1 2 3 4 5 6 6 7 8 0 2 2 3 4 5 6 7 8 1 1 1 2 2 3 4 5 5 6 6 8 9 0 0 1 鸣,唱E 咱A 咽BA 唱E 咽A 咱aA 唱A 唱EA,唱 “ny,“oy 内“, nZM Oyu “ay 万“0“。, nZM “OZ 只“。 “。,“7 内u n噜HW,肉4UU,咱EA, 数 山 皮 位 时 山 川 口 刚 , 吁 的 ,T t,J 1 个 ,u,三 川 川 叫,得 ,法 线 “, , 获 忖 ,主 ,段 “, 题 , 数 数 数 ,HHHb,与 “ 叮叮 数 忡 少 明,网 犯, 献 眯 盐 盐

2、,数, 叫,”,跚 线 线 ,尾 的 多,数 晒 事 钱 利 鱼,鱼数 的 的 数 方 朗 ,回 族 和,刷 刷 刷 卜 明 叫 树 时32孟22佳 跚 地 称芷,速 怦 脯 数 数 数 jm 瞅 数Z,M 制 制 制 星 最 次 乘 书 辉 删 蝉 阳 瞅 脐 僻 触 蜡 刊 蚓 辄 峨 斗,他 轩 阳 刚 挝 蛐 阴 阳 相 黝 精 明 刊 , 绘 绘 绘 歌 求 高 阶 借 杨 章 1 2 3 4 5 6 7 8 9 第,10 第二章 11 12 13 14 15 16 17 第三章 18 19 20 21 22 23 24 25 26 27 28 29 第四章 30 31 32,.,3

3、3 34 35 第五章 36 37 38 39 40 41 第六章 42 43 44 45 46 47 第七章 48 49 50 51 52 53 54 55 56 57 第八章 58 拉丁方.”.“.” 59 填表格 60 61 62 63 64 65 66 67 68 第九章 69 70 2,L,回文素数 要发就发 素数幻方,.”.”.”.33 .”.34 .36 44 44 45 45,不定方程求整数解.”.”.”. 百钱百鸡问题. 爱因斯坦的数学题.”.,换分币. - .”川.,年龄几何.“.“. . 46 三色球问题. .47,马克思手稿中的数学题.47,分数踵题. 49,最大公约数

4、和最小公倍数. , .”、.49 50,分数比较.“.”. 分数之和.”,将真分数分解为埃及分数“.52,列出真分数序列.”. :.” 53,计算分数的精确值.“.54 逻镜推理与判断.56 新娘和新郎”.“.56 委派任务.”.57 谁在说谎.”.58 谁是窃贼”.”.”.”.“.59 黑与白.”.”.”.60,谜语博士的难题 (1) . . 61,谜语博士的难题( 2) .62 哪个大夫哪天值班.“.”.“.64 区分旅客国籍. .66 谁家孩子跑最慢“.”.”.68 70 70,数字。到的奇妙变幻.川.”.,1 9 分成 1 : 2 I 3 的三个 3 位数.”. ,. 72 1 9 组

5、成三个 3 位的平方数. . .”73,由 8 个整数形成奇特的立方体.-. - .:.山. 75,减式还原 “ 乘式还原( 1) .、.”.”“. . 78,乘式还原(2).“.“.79 除式还原(1)“.”.”.“82 83,除式还原(2).”.?山”.叩“.,九位累进可除数.”.”.,_. 85,徽的变幻 .”.”.”.88 魔术师的猜牌术( 1) . ,.,.叫.”. 88 魔术师的猜牌术( 2).”.”.川”. .”.川. 89,,,,,民,AV,1A “。,nO AA崎,FD 。4 QJV Qd nV,AV A 。qd pu,au 。o,nv qu,A丛E nt nu 14,RU

6、Qu au nwu nv,1i qJV 严D,n3,9 9 9 9 9 9 0山 QU Od 9 0 0 0 0 0 0 o o 1 1 1 2 2 2 2 2 3 3 3 3 3,唱EA 唱EE 咱EA 咽 唱a 咱E4 唱EEA 咽, 咱EA 唱A 咽EA 唱EA 唱EA 唱EA,喃自4,唱EA EA 咽A TE啥唱EA 咽EA,、,EA 4,数 整 , 正 “, ,uu, 字 ,u,个 码 川 质 数,5 硅 性,uuuu, 马 H 罗,的 块 , 趣 uu,uuuuuu, ,U,H 列 数,3 4, 题 ,) 有,HHHH,UHHHUH 川 、尸 u,n,为,法, 寸 的 果 趣 0

7、0 个 “ “,u,H,u,uqqu,序 u 译 u,的 u,加 U,1 磅,糖 山 洒,值 值 一 数 理 成,” “, H,U, 戏 戏 程 翻 件 的 川,题 间,示 分,分 想 似 似的 “ “,常 定 形 戏,” 换 “ “,游 游 川 味 “,数 “ 条 “ 数 “,合 表 叫 孩 书 ,的 猜 近 近 方 想 理 克 斯 的 游 牌 交 军 戏 数 数 “,趣 子 伯 赛 异 题 整 动,夫,组 能 1 小 买 松 与 的 的 平 猜 定 列 彻 数 力 发 子 将 “,游猜 猜 塔 它 产 拉 比 特 问 正 移,瑟 票 数 称 个 明 瓦 理 数 谷 方 布 科 文 智 动

8、白 胜 山 机 机 诺 其 子 阿 美 足 后 MK 字,约,邮 和 可 川 小 波 定 求 求 奇 角 四 卡 尼 固,自 黑 常 抢 搬 入 人 汉,兔 将 选 满 八 超 数,章,章,。, 刊 刊 刊 付 章 刊m mm 阳 白 白 第,臼 UM 臼 “ 盯 胞 第,的 问 贝 归 归,二 问 归 mw 阻 四 川, 第,f,3,,,第一章最简单的问题与算法,,,作为趣味程序设计的入门,我们先来涉猎一些简单的例子。通过这些例子,让读者体验一 下程序设计的乐趣。 1. 绘制余弦曲线 在屏幕上用“铃”显示 0。360。的余弦函数cos(x )曲线。 姥问题分析与算法设计, 如果在程序中使用数

9、组,这个问题十分简单。但若规定不能使用数组,问题就变得不容易 了。 关键在于余弦曲线在 0。360。的区间内,一行中要显示两个点F 而对一般的显示器来说, 只能按行输出,即:输出第一行信息后,只能向下一行输出,不能再返回到上一行。为了获得本 题要求的图形就必须在行中次顺序输出两个“祷”。 为了同时得到余弦函数 cos(x )图形在一行上的两个点,考虑利用 cos (x )的左右对称性。 将屏幕的行方向定义为 x ,列方向定义为y ,则o1so的图形与 180。360。的图形是左右对 称的。若定义图形的总宽度为 62 列,计算出 x 行。180。时y 点的坐标 m ,那么在同一行与之 对称的 1

10、80。.360。的y 点的坐标就应为 62-m 。程序中利用反余弦函数acos 计算坐标仪,y) 的对应关系。 使用这种方法编出的程序短小精练,体现了一定的技巧。 普程序说明与注释 #include (stdio. h #include (math. h) main() double y; mt x ,口1;,for (y = 1; y = -1; y O. 1) ,怜 y 为列方向,值从 1到一 1,步长为0. 1 铃,m=acos(y )铃 10;,铃计算出y 对应的弧度 m ,乘10 为图形放大倍数铃,for (x=l; xm; x+) printf (” ; print(” II) I

11、 for(; x62-m; x+) printf (”) ; printf (”铃n);,赞控制打印左侧的赘号铃,铃控制打印同一行中对称的右侧祷号祷,铸运行结果,?,民,民,* *,当k ,民,* *,*,,民,* * , 岖 比 民,*, ,*,大 ,* 民,曾, ,也民, ,食k,*,长思考题,如何实现用“祷”显示 oo360。的sin(x )曲线。 2. 绘制余弦曲线和直线 在屏幕上显示 0。360的 cos(x )曲线与直线们对45 铸(y-1)+31 的迭加图形。其中 cos(x )图形用“脊”表示, f (x )用“十”表示,在两个图形的交点处则用 f(x)图形的符号。 铃问题分析

12、与算法设计 本题可以在上题的基础上进行修改。图形迭加的关键是要在分别计算出同一行中两个图 形的列方向点坐标后,正确判断相互的位置关系。为此,可以先判定图形的交点,再分别控制打 印两个不同的图形。 铸程序说明与注释 #include (stdio. h) #include (math. h) main() double y; int x , m , n , yy; for (yy=O; yy if ( x=m ,羡运行结果, * *, ,*, ,3比,*,*, 民,*, ,*,,比 民,民, *,民 也比,民,* ? ?翻,*,* ,*,民,铸思考题 如何实现 sin(x)曲线与 cos(x )

13、曲线图形的同时显示。 3. 绘制圆,在屏幕上用“祷”画一个空心的圆。 铃问题分析与算法设计 打印圆可利用图形的左右对称性。根据圆的方程 z R R=X X+Y Y 可以计算出圆上每点行和列的对应关系。 铸程序说明与注释 #include (stdio. h #include (math. h main() double y; mt x ,口l; for (y=lO; y=-10; y 一 m = 2.5 铃 sqrt(l-00-y 餐 y);,铃圆的半径为 10 铃,铃计算行y 对应的列坐标 m。2. 5 是屏幕纵横比调节系数,因为屏幕的 行距大于列距,不进行调节显示出来的将是椭圆铸,for

14、(x=l; x30-m; x+) print (”) ;,赞图形左侧空白控制怜 3,print”誉”); for (; x30+m; x 十十) printf (”) ; print (”传n”;,祷圆的左侧铃祷 祷图形的空心部分控制铃 铃圆的右侧铃备, 铸运行结果,警碍 言6,.,当,.2鼻,.习 、6 、 萨,3,. 刻,、 习,言,、6,、,、昏,到萨,、 3鼻,.,布,,尊,.,刻, 、6 、,到萨,. 、6,、,尊且$,铃忠考题,实现函数 y=x2 的图形与圆的图形的叠加显示。 4. 歌星大奖赛 在歌星大奖赛中,有 10 个评委为参赛的选手打分,分数为 1到 100 分。选手最后得分

15、为 z 去掉一个最高分和一个最低分后其余 8 个分数的平均值。请编写一个程序实现。 铸问题分析与算法设计 这个问题的算法十分简单,但要撞意在程序中判断最大、最小值的变量是如何赋初值的。 铃程序说明与注释 main() int integer, i, max, min, sum;,max=-32768; min=32767; sum=O;,铃先假设当前的最大值 max 为 C 语言革型数的最小值势 铃先假设当前的最小值 min 为 C 语言整型数的最大值 I 将求累加和变量的初值置为 0 铸,for (i = 1; imax) max=integer; if (integermin) min=i

16、nteger;,祷输入评委的评分怜 铃计算总分怜 ,快通过比较筛选出其中的最高分铸 铃通过比较筛选出其中的最低分铸,printf (”Canceled max score: %dnCanceled min score: %d”, max, min); 4,print (” Average score: %dn,(sum-max-min)/8);,铃输出结果祷,铃运行结果 Input number 1=90 Input number 2 = 91 Input number 3=93 Input number 4=94 Input number 5= 90 Iriput number 6=99 I

17、nput number 7 = 97 Input number 8=92 Input number 9=91 Input number 10=95 Canceled max score: 99 Canceled min score : 90 Average score: 92 骨思考题 题目条件不变,但考虑同时对评委的评分进行裁判,即在 10 个评委中找出最公平(即评分 最接近平均分)和最不公平(即与平均分的差距最大)的评委,程序应怎样实现? s. 求最大约数 问 555555 的约数中最大的三位数是多少? 铃问题分析与算法设计 根据约数的定义,对于一个整数 N,除去1和它自身之外,凡能整除

18、N 的数即为 N 的约 数。因此,最简单的方法是用 2 到 N-1之间的所有数去除 N,即可求出N 的全部约数。本题 只要求取约数中最大的三位数,则其取值范围可限制在 100 到 999 之间。 赞程序说明与注锋 main(), long i; int j; printf(Please input number :”); scanf (” %ld1, j 一一) 铃所求的约数的可能取值是从 999 到 100,j 从大到小祷,if (i%j= =0) 祷若是约数,则输出结果祷 print (The max factor with 3 digits in %ld is: %d. n”, i j)

19、,铃使用长整型变量,以免超出整数的表示范围祷,break;,5,一一一一一,铃运行结果 输入: 555555 输出:The max factor with 3 digits in 555555 is: 777.,6. 高次方数的尾数,求 13 的 13 次方的最后三位数。 祷问题分析与算法设计 解本题最直接的方法是:将 13 累乘 13 次后截取最后三位即可。 但是由于计算机所能表示的整数范围有限,用这种“正确”的算法不可能得到正确的结果。 事实上,题目仅要求后三位的值,完全没有必要求 13 的 13 次方的完整结果。 研究乘法的规律会发现:乘积的最后三位的值只与乘数和被乘数的后三位有关,与乘

20、数和 被乘数的高位无关。利用这一规律,可以大大简化程序。 铃程序说明与注释 main(), int. i, x, y, last= 1;铃变量last 保存求 X 的 Y 次方过程中的部分积的后三位铃,printf (Input x and y ex 铃快 Y) :); scanf (” %d 祷铸 %dI i十),怜 X 自乘Y 次祷,last = iast 提 x %1000;势将last 乘 X 后对 1000 取模,即求积的后三位祷 printf (” The last 3 digits of %d 赞铸 %dis: %dn, x, y, last%1000); 问打印结果铃 祷运行结

21、果 Input X and Y CX 祷祷 Y): 13 铃 13 he last 3 qigits of 13祷铸 13 is: 253 Input X andY CX 铃祷 Y):13 铃保 20 The last 3 digits of 13餐善 20 is: 801 7. 阶乘尾数零的个数 100!的未尾有多少个零? 赞问题分析与算法设计 可以设想:先求出 1001 的值,然后数一下末尾有多少个零事实上,与上题一样,由手计算 机所能表示的整数范围有限,这是不可能的。,为了解决这个问题,必须首先从数学上分析在 100!结果值的末尾产生霉的条件。不难看,出z一个整数若含有一个因子 5则必然

22、会在求 100t 时产生一个零。因此问题转化为求 1到 10。,这 100 个整数中包含了多少个因子 5。若整数N 能被 25 整除,则 N 包含 2 个因子 5 ;若整数N 能被 5 整除,则 N 包含 1个因子 5。 铸程序说明与注释 main ()、 int a, count=O; 6,for (a=5; a=lOO; a+=5) count 十; if ( ! Ca%25) ) count+;,势循环从5 开始,以 5 的倍数为步长,考察整数铃 铃若为5 的倍数,计数器加 1 铃 择若为25 的倍数,计数器再加 1 铃,printf(Th number of 0 in the end

23、of 100! is: %d. n”, count);怜打印结果铃 铸运行结果 The number of 0 in the end of 100! is : 24. 祷问题的进一步讨论 本题的求解程序是正确的,但存在明显的缺点。程序中判断整数 N 包含多少个因子 5 的 方法是与题目中 100 有关的,若题目中的 100 改为 1000,则就要修改程序中求因子5 的数目 的算法了。 势思考题 修改程序中求因子 5 的数目的算法,使程序可以求出任意 NJ 的末尾有多少个零。,8. 借书方案知多少 小明有五本新书,要借给 A 、B、C 三位小朋友,若每人每次只能借一本,则可以有多少种不 同的借法

24、? 养问题分析与算法设计 本问题实际上是一个排列问题,即求从 5 个中取 3 个进行排列的方法的总数。首先对五本 书从 1 至 5 进行编号,然后使用穷举的方法,假设三个人分别借这五本书中的一本,当三个人 所借的书的编号都不相同时,就是满足题意的一种借阅方法。 势程序说明与注释 main() int a, b, c, count=O; printf(11There are different methods for XM to distribute books to 3 :r:eaders: n”) ;,for (a=l; a=5; a+) for (b=l; b=5; b+),赞穷举第一个人

25、借 5 本书中的 1本的全部情况替 祷穷举第二个人借 5 本书中的 1本的全部情况祷,for (c=l; a! =b C 十) 铸当前两个人借不同的书时,穷举第三个人借 5 本书中的 1本的全部情况祷,if (cl =a 备打印可能的借阅方法铃 祷运行结果 There are different methods for XM to distribute books to 3 readers:,9. 杨辉二角形 在屏幕上显示杨辉三角形: 1,1,1,1,2,1,1,3,3,1,1,4,6,4,1,1,5,10,10,5,1,铸问题分析与算法设计 杨辉三角形中的数,正是“ y )的 N 次方幕展开

26、式中各项的系数。本题作为程序设计中 具有代表性的题目,求解的方法很多,这里仅给出一种。 从杨辉三角形的特点出发,可以总结出: 第 N 行有 N+l 个值(设起始行为第 0 行) ; 对于第N 行的第 J 个值: CN=2),当 J=l 或 J=N+l 时z,其值为 1;,当 JI =1 且J! =N+l 时:其值为第 N 一1行的第 J一1个值与第 N-1 行第 J 个值之和 F 将这些特点提炼成数学公式可表示为 z,c.(x,v)= lc(x-1,y 1) + c(x-1,y) 本程序就是根据以上递归的数学表达式编制的。 铃程序说明与注释 main() int i,j,n=l3; 8,x=l

27、 或 x=N+l 其它,print ” N=); while (n 12) scanf (” %d”,.n); for (i=O; i=n; i十),for (j=O; j12 一i 川) print (” : for (j=l; ji+2; j+) printf ( %6d”, e(i,j); printf(n );,祷控制输入正确的值以保证屏幕显示的图形正确铃 铸控制输出N行赞,铃控制输出第i行前面的空格快 祷输出第i行的第 j 个值铃,int c(x,y) int x, y; int z; if y = = D I I y = = x 十 1) ) return(l); ,铃求杨辉角形中

28、第 x 行第 y 列的值铃,提若为x 行的第 1或第 x十1列,则输出 1 祷,z = c(x 一 l ,y-1) 十 c(x l ,y); 祷否则,其值为前行中第 y 1列与第 y 列值之和祷 return(z); 赞运行结果 输入:N=12 输出 z,1,1,1,1,2,1,1,3,3,1,1,4,6,4,1,1,5,10,10,5,1,1,6,15,20,15,6,1,1,7,21,35,35,21,7,1,1,8,28,56,70,56,28,8,1,1,9,36,84,12612684,36,9,1,1,10,45,12021025221012045.,10,1,11,55,1653

29、30462462330165 220495,55,11,1,1,12,66,792924,792495220,66,12,1,9,传思考题 自行设汁一种实现杨辉三角形的方法。 10. 数制转换 将任一整数转换为二进制形式。 铸问题分析与算法设计 将十进制整数转换为二进制形式的方法很多,这里介绍的实现方法利用了 C 语言能够对 位进行操作的特点。对于 C 语言来说,一个整数在计算机内部就是以二进制形式存储的,所以 没有必要再将一个整数经过一系列的运算转化为工进制形式,只要将整数在内存中的二进制 表示输出即可。 势程序说明与注释 #include (stdio. h main() int x; p

30、rint (” Input number:) ; scanf( %d”, 铃 X :整数sizeof (int) :int 型在内存中所占的字节数, sizeof (int )秘 8:int 型对应的位数铃 putchar (n );,printb (x, n) mt x, n; 。 if CnO) ,祷输出整数x 二进制形式的后 n 位铃,putchar(O+ ( (unsigned)Cx,铸输出第n 位祷,printb 仗,n 一 1);,铃递归调用,输出 x 的后 n-1 位堤,Lr i,,铃运行结果 输入: 8 输出: number of decimal form: 8 its bin

31、ary form: 0000000000001000 输入:8 输出: number of decimal form: -8 it s binary form: 1111111111111000 输入: 32767 输出: number of decimal form: 32767 10,、1,it s binary form : 0111111111111111 输入:32768 输申: number of decimal form: -32768 it s binary form: 1000000000000000 输入: 128 输出:number of decimal form: 12

32、8 it s binary form : 0000000010000000 眷问题的进一步讨论 充分利用 C 语言可以对位进行操作的特点,可以编写许多其它高级语言不便于编写甚至 根本无法编写的程序。位操作是 C 语言的一大特点,在深入学习 C 语言的过程中应力求很好 掌握。 程序中使用的位运算方法不是最佳的,也可以不用递归操作,读者可自行对程序进行优 化。 祷思考题 将任意正整数转换为四进制或八进制数。,也,11,第二章生活中的数学问题,11. 打鱼还是晒网,中国有句俗语叫“三天打鱼两天晒网”。某人从 1990 年 1月 1 日起开始“三天打鱼两天晒 网”,问这个人在以后的某一天中是在“打鱼气

33、还是在“晒网飞 势问题分析与算法设计 根据题意可以将解题过程分为三步 z 汁算从 1990 年 1月 1 日开始至指定日期一共有多少天; 由于“打鱼”和“晒网”的周期为 5 天,所以将计算出的天数用 5 去除 F 根据余数判断他是在“打鱼”,还是在“晒网”: 若余数为 1、2、3,则他是在“打鱼” 否则是在“晒网”。 在这三步中,关键是第一步。求从 1990 年 1月 1 日至指定日期有多少天,要判断经历年份 中是否有闰年,若是闰年,二月为 29 天,平年为 28 天。判断闰年的方法可以用伪语句描述如 下z,1骨,如果(年能被 4 除尽且不能被 100 除尽)或能被 400 除尽) 则该年是闰

34、年 f,否则不是闰年。 C 语言中判断能否整除可使用求余(模)运算。 特程序与程序注释 struct date int year; int month; int day;,、,main() struct date today, term; int yearday, year, day; printf (” Enter year /month/day z ”) ; scanf (” %d%d%d ”,.t()day. year ,铃输入日期特,term. month = 12; term. day = 31;,铸设置变量的初始值:月饼 铃设置变量的初始值z 日祷,for (yearday=O,y

35、ear=l990; yeartoday.year; year+) term. year = year; 12,快定义日期结构祷,._,yearday += days(term);,铃计算从 1990 年至指定年的前一年共有多少天铃,yearday 十 days (today) ; day = yearday % 5; if (dayO , int i,lp; lp = day.year%4=0 势判定year 为闰年还是平年, lp=O 为平年,非 0 为闰年讲,days(day) struct date day; static int day_ tab 213=,蕃二维数组形式的天数表作为参

36、数祷,0,31,28,31,30,31,30,31,31,30,31,30,31, 0,31,29,31,30,31,30,31,31,30,31,30,31,铃平年每月的天数祷 铸闺年每月的天数势,for (i=l; iday.month; i+) day. day+ =day 一 tablpi; return(day. day);,飞计算本年中自 1月 1 日起的天数铃,铃运行结果 Enter year/month/day: 199110 25 He was fishing at that day. Enter year/month/day: 1992 10 25 He was sleep

37、ing at that day. Enter year/month/day: 1993 10 25 He was sleeping at that day. 祷思考题 请打印出任意年份的日历。 12. 舰交通肇事犯 一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号?只记下车 号的一些特征。甲说:牌照的前两位数字是相同的 F z说:牌照的后两位数字是相同的,但与前 两位不同;丙是位数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车 号。 提问题分析与算法设计 按照题目的要求造出一个前两位数相同、后两位数相同且相互间又不同的整数,然后判断 该整数是否是另一个整

38、数的平方。 铃程序与程序泣释 13,.i ,#include math. h main() int i, j, k, c; for (i=l; i二9; i+) for (j=O; j=9; j+) if ( i ! = j ) k=i 铃 lOOO+i * 100十j 铃 lO+j; for( c=31; c 祷 ck; c 十); if ( c 祷 c= =k) printf(Lorry-No.,祷 i z 车号前二位的取值铃 快 j :车号后二位的取值善 铃判断两位数字是否相异铃 祷计算出可能的整数替 祷判断该数是否为另一整数的平方普 is %d. n”, k);铃若是,打印结果铃,A哇

39、 A哇 巧i 句e,,gu,O N PR ,结 行 运 U赏, A I,13. 该存多少钱 假设银行一年整存零取的月息为 o. 63% 。现在某人手中有一笔钱,他打算在今后的五年 中每年的年底取出 1000 元,到第五年时刚好取完,请算出他存钱时应存入多少。 祷问题分析与算法设计 分析存钱和取钱的过程,可以采用倒推的方法。若第五年年底连本带息要取1000 元,则要 先求出第五年年初银行存款的钱数: 第五年年初存款1000/(1+12 铃 0.0063) 依次类推可以求出第四年、第三年.的年初银行存款的钱数: 第四年年初存款(第五年年初存款 1ooo)Io+12 铸 0.0063) 第三年年初存

40、款(第四年年初存款 1000)/(1+12 怜 0.0063) 第二年年初存款(第三年年初存款 1ooo)Io+12 椅 0.0063) 第一年年初存款(第二年年初存款十 1000)Io+12 铸 0.0063) 通过以上过程就可以容易地求出第一年年初要存入多少钱。 铃程序与程序注释 main() inti; float total=O.; for (i=O; iS; i 十)善 i 为年数,取值为 04 年祷 total = (tot!J.l + 1000. ) / (1+ . 0063 祷 12); 铃累计算出年初存款数额,第五次的计算结果即为题解长 printf(He must save

41、 %. 2 at first. n, total); 铃运仔结果 He must save 4039. 44 at first.,/ 14,.,14. 怎样存钱利最大 假设银行整存整取存款不同期限的月息利率分别为: 0. 63%期限 1年 0. 66%期限2 年 0. 69%期限 3 年 o. 75%期限5 年 0. 84%期限8 年 利息本金月息利率 12存款年限。 现在某人手中有 2000 元,请通过计算选择一种存钱方案,使得钱存入银行 20 年后得到的 利息最多(假定银行对超过存款期限的那部分时间不付利息)。 铃问题分析与算法设计 为了得到最多的利息,存入银行的钱应在到期时马上就取出来,

42、然后立刻将原来的本金和 利息加起来再作为新的本金存入银行,这样本利不断地漉动直到满 20 年为止。由于存款的利 率不同,所以不同的存款方法(年限)存 20 年得到的利息也是不一样的。 分析题意,设 2000 元存 20 年,其中 1年存 il 次,2 年存 i2 次,3 年存 i3 次,5 年存 i5 次,8 年存 i8 次,则到期时存款人应得的本利合计为: 2000 赞 (1十ratel)i1 铸 Cl +rate2)i2 择。十 rate3)i3 铃。rate5Y5 祷 (1+rate8)i8 其中 rateN 为对应存款年限的利率。根据题意还可得到以下限制条件: 0 #include (

43、math. h) main(),int i8, i5, i3, i2, il, n8, n5, n3, n2, nl; float max=O, term; for(i8=0; i83; i8+) for(i5=0; i5= (20-8 铃 i8)/5; is+) for(i3=0; i3=(20-8 祷 i8-5 铃 i5)/3; i3+),、 祷穷举全部可能的存款方式何,for(i2=0; i2= (Z0-8 祷 i8-5 传 i5-3 提 i3)/2; i2+) il = 20-8 祷 i8-5 祷 i5-3 铃 i3-2 铃 i2; terrn=2000. 0 铃 pow( (doub

44、le) Cl +o. 0063 铃 12),他ouble)il) 备 pow( (double) (1十 2 铃 0.0066 祷 12),(double)i2) 15, c_.,l四”趟圃,.,叫“输叶飞m ,if (termmax) ,祷 pow( (double) (1+3 祷 0. 0069 铃 12), (double)i3) 铃 pow( (double) (1+5 铃 0.0075 铃 12),(douhle).i5) 祷 pow( (double) (1+8 祷 0.0084 祷 12),(double)i8); 祷计算到期时的本利合计蜂 长若为最大值,记录存款方式幡,max=

45、term; nl=il; n2=i2; n3=i3; n5=i5; n8=i8;,printf(For maxinum profit, he should so save his money in a bank:n); printf (made fixed deposit for 8 year : %cl times n”, n8); print (”made fixed deposit for 5 year: %cl timesn”, n5); printf(made fixed deposit for 3 year: %d timesn”, n3);,printf ( printf( pr

46、intf (,made fixed deposit for 2 year: %d timesn”, n2); made fixed deposit for 1 year: %cl timesn”, nl); Total: %. 2fn, max);,岳 i输出存款方式祷 铃运行结果 For maxinurn profit, he should so save his money in a bank: made fixed deposit for 8 year: 0 times made fixed deposit for 5 year: 4 times made fixed deposit f

47、or 3 year: 0 times made fixed deposit for 2 year: 0 times made fixed deposit for 1 year: 0 times Total: 8841. 01 可见最佳存款方案为连续四次存 5 年期。 铃思考题 某单位对职工出售住房,每套为 2 万元。买房付款的方法是 2 一次交清,优惠20% 。 从第一年开始,每年年初分期付款: 5 年交清,优惠 15%; 10 年交清,优惠 lOYo; 20 年交清,没有优惠。 现在有人手中正好有 2 万元,若假定在今后 20 年中物价和银行利率均保持不变,问他应 当选择哪种付款方式可以使应

48、付的钱最少? 15. 捕鱼和分鱼 A 、B、C、D、E 五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方 睡觉。日上三杆,A 第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。 B 第 16,飞.耐排,二个醒来,也将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。 C、D、E 依次醒来,也按同 样的方法拿鱼。问他们合伙至少捕了多少条鱼? 养问题分析与算法设计 根据题意,总计将所有的鱼进行了五次平均分配,每次分配时的策略是相同的,即扔掉一 条后剩下的鱼正好分为五份,然后拿走自己的一份,余下其它四份。 假定鱼的总数为 X ,则X 可以按照题目的要求进行五次分配: X

49、-1 后可被 5 整除,余下的 鱼为 4 CX-1) 5。若X 满足上述要求,则 X 就是题目的解。 势程序与程序注释 main(), int n, i, x, flag= 1; for (n=6; flag; n 十),号 flag :控制标记祷 铃采用试探的方法,令试探僵 n 逐步加大祷,for (x=n, i=1 ,else flag= 0 ; if (flag) break; else flag= 1;,提若不能分配则置标记 flag=O 退出分配过程悦 祷若分配过程正常结束则找到结果退出试探的过程祷 养否则继续试探下一个数%,printf(Total number of fish c

50、atched = %dn”, n);,祷输出结果祷,祷运行结果 Total number of fish catched = 3121 祷问题的进一步讨论 程序采用试探法,试探的初值为 6 ,每次试探的步长为1。这是过分保守的做法。可以在进 一步深入分析题目的基础上修改初值,增大试探的步长值,以减少试探次数。 快思考题 请使用其它的方法求解本题。 16. 出售金鱼 买买提将养的一缸金鱼分五次出售:第一次卖出全部的一半加二分之一条 p 第二次卖出余 下的二分之一加三分之一条 z 第三次卖出余下的四分之一加四分之一条 z 第四次卖出余下的五 分之一加五分之一条 p 最后卖出余下的 11 条。问原来

51、鱼缸中共有几条鱼? 铸题目分析与算法设计 题目中所有的鱼是分五次出售的,每次卖出的策略相同 z 第 j 次卖剩下的(j 十 )分之一再 加 l/(j+l)条。第五次将第四次余下的 11条全卖了。 假定第 j 次鱼的总数为 X ,则第j 次留下t x 一位D /(j+l) 当第四次出售完毕时,应该剩下 11条。若 X 满足上述要求,则 X就是题,昂的解。、 应当注意的是: Cx+ D I Cj十 1)应满足整除条件。试探X 的,初值可以从 23 开始,试探的,_.r,步长为 2 ,因为X 的值一定为奇数。 保程序说明与注锋 main() inti, j, n=O, x; for (i=23; n

52、=O; i 十2) for (j=l, x=i; j=ll; i+),养 n 为标志变量赞 铃控制试探的过程和步长铃 禄完成出售四次的操作铸,if ( (x 十 1) % (j+l) =O) x 一 Cx+ l)/Cj+ 1); else x=O; break; if ( j = = 5 n=l;,,,普运行结果 There are 59 fishes at first. 祷思考题 日本著名数学游戏专家中村义作教授提出这样一个问题 z 父亲将 2520 个桔子分给六个儿 子。分完后父亲说:“老大将分给你的桔子的 1/8 给老二;老二拿到后连同原先的桔子分 1/7 给 老三 z 老三拿到后连同原

53、先的桔子分 1/6 给老四:老四拿到后连同原先的桔子分 1/5 给老五 z 老五拿到后连同原先的桔子分 1/4 给老六;老六拿到后连同原先的桔子分 1/3给老大”。结果 大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子? 17. 平分七筐鱼 甲、乙、丙三位、渔夫出海打鱼,他们随船带了 21 只箩筐。当晚返航时,他们发现有 7 筐装满 了鱼,还有 7 筐只装了半筐鱼,另外 7 筐则是空的。由于他们没有秤,只好通过目测认为 7 个满 筐鱼的重量是相等的, 7 个半筐鱼的重量是相等的。在不将鱼倒出来的前提下,怎样将鱼和筐 平分为三份? 势问题分析与算法设计 根据题意可以,知道:每个人应分到七个

54、箩筐,其中有 3. 5 筐鱼。采用一个 33 的数组a 来 表示三个人分到的东西。其中每个人对应数组 a 的一行,数组的第 0 列放分到的鱼的整筐数, 数组的第 1列放分到的半筐数,数组的第 2 列放分到的空筐数。由题目可以推出: 数组的每行或每列的元素之和都为 7; 对数组的行来说,满筐数十半筐数3. 5; 每个人所得到的满筐数不能超过 3 筐 z 每个人都必须至少有1个半筐,且半筐数一定为奇数 对于找到的某种分鱼方案,三个人谁拿哪一份都是相同的。为了避免出现重复的分配方 案,可以规定 E 第二个人的满筐数大于等于第一个人的满筐数 F 第二个人的半筐数大于等于第 18,一个人的半筐数。 并程

55、序与程序注锋 int a33, count; main() int i , j , k , m , n , flag ; printf (叮t exists possible distribution plans: n) ; for (i=O; i3 ) continue;椅第三个人满筐数不能3 铃 if ( a20alO ) break;,提要求后一个人分的满筐数前一个人,以排除重复情况祷,for 他l; k=5; k+=2) aOl=k; for (m=l; m7-k; m+=2) al l=m; a21=7-k-m;,长试探半筐aOi 的值,半筐数为奇数铃,骨试探半筐al 1的值,半筐数为奇数铃,for (flag=l, n=O; flag n 十) 蕃判断每个人分到的鱼是否为 3. 5 筐,flag 为满足题意的标记变量锵 if ( ano+an17 ,羡计算应得到的空筐数量祷 养不符合题意则置标记为 0 讲,if (flag) printf (” No. %d,铸若符合题意则输出每个人的分配情况铃 Full basket Semi -basket Empty n”,count);,A+n, anO, anl, an 2);,19,-,岳运行结果 It exists. possible distribution plans: No. lFull basket,Semi -

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!