《C语言趣味程序百例精解.pptx》由会员分享,可在线阅读,更多相关《C语言趣味程序百例精解.pptx(144页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
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 唱E A唱 “n y“o y 内“,nZM O y u “ay 万“0“。,n Z M “O Z 只“。“。,“7 内u n噜H W肉4U U咱EA 数 山 皮 位 时 山川 口 刚 吁 的 T tJ 1 个 u三 川 川 叫得 法 线 “获 忖 主 段“题 数 数 数 HHHb与“叮叮 数 忡 少 明网 犯 献 眯 盐 盐数 叫”跚 线 线 尾 的 多数 晒 事 钱 利 鱼鱼数
2、 的 的 数 方 朗 回 族 和刷 刷 刷 卜 明 叫 树 时32孟2 2佳 跚 地 称芷速 怦 脯 数 数 数 jm 瞅 数ZM 制 制 制 星 最 次 乘 书 辉 删 蝉 阳 瞅 脐 僻 触 蜡 刊 蚓 辄 峨 斗,他 轩 阳 刚 挝 蛐 阴 阳 相 黝 精 明 刊,绘 绘 绘 歌 求 高 阶 借 杨章 1 2 3 4 5 6 7 8 9第10第二章11121314151617第三章181920212223242526272829第四章303132,.333435第五章363738394041第六章424344454647第七章48495051525354555657第八章58 拉 丁 方
3、.”.“.”59 填表格606162636465666768第九章69702L回 文 素 数要发就发素 数 幻 方.”.”.”.33.”.34.3644444545不 定 方 程 求 整 数 解.”.”.”.百 钱 百 鸡 问 题 .爱 因 斯 坦 的 数 学 题 .”.换 分 币.-.”川.年龄几何.“.“.46 三 色 球 问 题.47马 克 思 手 稿 中 的 数 学 题.4 7分 数 踵 题.49最 大 公 约 数 和 最 小 公 倍 数.,.”、.4950分 数 比 较 .“.”.分 数 之 和.”将 真 分 数 分 解 为 埃 及 分 数“.52列 出 真 分 数 序 列 .”.:
4、.”53计 算 分 数 的 精 确 值.“.54逻镜推理与判断.56新 娘 和 新 郎”.“.56委派任务.”.57谁 在 说 谎 .”.58谁 是 窃 贼”.”.”.”.“.5 9黑与白.”.”.”.60谜 语 博 士 的 难 题 (1).61谜 语 博 士 的 难 题(2).62哪 个 大 夫 哪 天 值 班 .“.”.“.64区 分 旅 客 国 籍 .66谁 家 孩 子 跑 最 慢 “.”.”.687070数 字。到 的 奇 妙 变 幻.川.”.1 9 分 成 1 :2 I 3 的 三 个 3 位 数.”.,.721 9 组 成 三 个 3 位 的 平 方 数 .”73由 8 个 整 数
5、 形 成 奇 特 的 立 方 体 .-.-.:.山.75减 式 还 原 “乘 式 还 原(1).、.”.”“.78乘 式 还 原(2).“.“.79除 式 还 原(1)“.”.”.“8283除 式 还 原(2).”.?山”.叩“.九 位 累 进 可 除 数 .”.”.,_.85徽 的 变 幻 .”.”.”.88魔 术 师 的 猜 牌 术(1).,.,.叫.”.88魔 术 师 的 猜 牌 术(2).”.”.川”.”.川.89 ,民A V1 A“。,n O AA崎F D 。4 Q JV Q d n VA V A 。qd p ua u 。on v q uA丛E n t n u 1 4R U Q u
6、a u n w u n v1i q JV 严Dn 39 9 9 9 9 9 0山 Q U O d 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 唱E A 唱EA 唱E A喃自4唱EA EA 咽A T E啥唱E A 咽EA、E A 4数 整 正 “uu 字 u个 码 川 质 数5 硅 性uuuu 马H 罗的 块 趣 uuuuuuuu UH 列 数3 4 题)有HHHHUHHHUH 川、尸 un为法 寸 的 果 趣 0 0 个 “uHuuqqu序 u 译 u的 u加 U1 磅,糖
7、山 洒值 值 一 数 理 成”“HU 戏 戏 程 翻 件 的 川题 间示 分分 想 似 似的“常 定 形 戏”换“游 游 川 味“数“条“数“合 表 叫 孩 书,的 猜 近 近 方 想 理 克 斯 的 游 牌 交 军 戏 数 数“趣 子 伯 赛 异 题 整 动夫组 能 1 小 买 松 与 的 的 平 猜 定 列 彻 数 力 发 子 将“游猜 猜 塔 它 产 拉 比 特 问 正 移瑟 票 数 称 个 明 瓦 理 数 谷 方 布 科 文 智 动 白 胜 山 机 机 诺 其 子 阿 美 足 后 M K 字约邮 和 可 川 小 波 定 求 求 奇 角 四 卡 尼 固自 黑 常 抢 搬 入 人 汉兔 将
8、 选 满 八 超 数章章。刊 刊 刊 付 章 刊m mm 阳 白 白第臼 UM 臼 “盯 胞第的 问 贝 归 归二 问 归 mw 阻 四 川第 f3,第一章最简单的问题与算法,作为趣味程序设计的入门,我们先来涉猎一些简单的例子。通过这些例子,让读者体验一 下程序设计的乐趣。1.绘制余弦曲线在屏幕上用“铃”显示 0。360。的余弦函数cos(x)曲 线。姥问题分析与算法设计,如果在程序中使用数组,这个问题十分简单。但若规定不能使用数组,问题就变得不容易 了。关键在于余弦曲线在 0。360。的区间内,一行中要显示两个点F 而对一般的显示器来说,只能按行输出,即:输出第一行信息后,只能向下一行输出,
9、不能再返回到上一行。为了获得本 题要求的图形就必须在行中次顺序输出两个“祷”。为了同时得到余弦函数 cos(x)图形在一行上的两个点,考虑利用 cos(x)的左右对称性。将屏幕的行方向定义为 x,列方向定义为y,则o1so的图形与 180。360。的图形是左右对称的。若定义图形的总宽度为 62 列,计算出 x 行。180。时y 点的坐标 m,那么在同一行与之 对称的 180。.360。的y 点的坐标就应为 62-m。程序中利用反余弦函数acos 计算坐标仪,y)的对应关系。使用这种方法编出的程序短小精练,体现了一定的技巧。普程序说明与注释#include (stdio.h#include (m
10、ath.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)Ifor(;x 6 2-m;x+)printf(”);printf(”铃 n);赞控制打印左侧的赘号铃铃控制打印同一行中对称的右侧祷号祷铸运行结果?民 民*当k 民*,民*,岖 比 民*大*民 曾 也民 食k*长思考题如何实现用“祷”显示 oo360。的sin(x)曲 线。2.绘制余弦曲线和直线在屏
11、幕上显示 0。360的 cos(x)曲线与直线们对45 铸(y-1)+3 1 的迭加图形。其中 cos(x)图 形 用“脊”表 示,f(x)用“十”表示,在两个图形的交点处则用 f(x)图形的符号。铃问题分析与算法设计本题可以在上题的基础上进行修改。图形迭加的关键是要在分别计算出同一行中两个图 形的列方向点坐标后,正确判断相互的位置关系。为此,可以先判定图形的交点,再分别控制打 印两个不同的图形。铸程序说明与注释#include (stdio.h)#include (math.h)main()double y;int x,m,n,yy;for (yy=O;yy;:=20;y y+)y =0.1
12、 禄 yy;m =acos(l-y)铸 10;n =45 祷(y-1)+3 1;for (x=O;x if (x=m&x=n)else if (x=n )2,。elseprintf(n”);print(”);快打印不相交时的 cos(x)图形势卢其它情况打印空格铃else if f a=m 11 x=6 2-m)printf(铃 II);羡运行结果*3比*民*,比 民 民*民 也比 民*?翻*民铸思考题如何实现 sin(x)曲线与 cos(x)曲线图形的同时显示。3.绘制圆在屏幕上用“祷”画一个空心的圆。铃问题分析与算法设计打印圆可利用图形的左右对称性。根据圆的方程 zR R=X X+Y Y可
13、以计算出圆上每点行和列的对应关系。铸程序说明与注释#include (stdio.h#include (math.h main()double y;mt x,口l;for (y=lO;y =-1 0;y 一m =2.5 铃 sqrt(l-00-y 餐 y);铃圆的半径为 10 铃 铃计算行y 对应的列坐标 m。2.5 是屏幕纵横比调节系数,因为屏幕的 行距大于列距,不进行调节显示出来的将是椭圆铸for (x=l;x 3 0-m;x+)print(”);赞图形左侧空白控制怜3print ”誉”);for (;x30+m;x 十十)printf(”);print(”传 n”;祷圆的左侧铃祷祷图形的
14、空心部分控制铃铃圆的右侧铃备铸运行结果警碍言6,.当,.2鼻,.习、6、萨3,.刻、习 言、6、昏到 萨、3鼻.布,尊,.刻,、6、到 萨,.、6、尊且$铃忠考题实现函数 y=x2 的图形与圆的图形的叠加显示。4.歌星大奖赛在歌星大奖赛中,有 10 个评委为参赛的选手打分,分数为 1到 100 分。选手最后得分为 z 去掉一个最高分和一个最低分后其余 8 个分数的平均值。请编写一个程序实现。铸问题分析与算法设计这个问题的算法十分简单,但要撞意在程序中判断最大、最小值的变量是如何赋初值的。铃程序说明与注释main()int integer,i,max,min,sum;max=-32768;min
15、=32767;sum=O;铃先假设当前的最大值 max 为 C 语言革型数的最小值势铃先假设当前的最小值 min 为 C 语言整型数的最大值 I 将求累加和变量的初值置为 0 铸 for (i=1;imax)max=integer;if (integer=lOO;j 一一)铃所求的约数的可能取值是从 999 到 100,j 从大到小祷if (i%j=0)祷若是约数,则输出结果祷print(The max factor with 3 digits in%ld is:%d.n”,i j)铃使用长整型变量,以免超出整数的表示范围祷break;5一一一一一铃运行结果输入:555555输出:The ma
16、x factor with 3 digits in 555555 is:777.6.高次方数的尾数求 13 的 13 次方的最后三位数。祷问题分析与算法设计解本题最直接的方法是:将 13 累乘 13 次后截取最后三位即可。但是由于计算机所能表示的整数范围有限,用这种“正确”的算法不可能得到正确的结果。事实上,题目仅要求后三位的值,完全没有必要求 13 的 13 次方的完整结果。研究乘法的规律会发现:乘积的最后三位的值只与乘数和被乘数的后三位有关,与乘数和被乘数的高位无关。利用这一规律,可以大大简化程序。铃程序说明与注释main()int.i,x,y,last=1;铃变量last 保存求 X 的
17、 Y 次方过程中的部分积的后三位铃printf(Input x and y ex 铃 快 Y):);scanf (”%d 祷 铸%dI&.x&.y);for (i=1;i=y;i十)怜 X 自乘Y 次祷last =iast 提 x%1000;势将last 乘 X 后对 1000 取模,即求积的后三位祷 printf(”The last 3 digits of%d 赞铸%dis:%dn ,x,y,last%1000);问打印结果铃祷运行结果Input X and Y CX 祷 祷 Y):13 铃 13 he last 3 qigits of 13祷铸 13 is:253Input X andY
18、CX 铃祷 Y):13 铃 保 20The last 3 digits of 13餐 善 20 is:8017.阶乘尾数零的个数100!的未尾有多少个零?赞问题分析与算法设计可以设想:先求出 1001 的值,然后数一下末尾有多少个零事实上,与上题一样,由手计算 机所能表示的整数范围有限,这是不可能的。为了解决这个问题,必须首先从数学上分析在 100!结果值的末尾产生霉的条件。不难看出z一个整数若含有一个因子 5则必然会在求 100t 时产生一个零。因此问题转化为求 1 到 10。这 100 个整数中包含了多少个因子 5。若整数 N 能被 25 整除,则 N 包含 2 个因子 5;若整数 N 能
19、被 5 整除,则 N 包含 1个因子 5。铸程序说明与注释main()、int a,count=O;6for (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 of 100!is:%d.n”,count);怜打印结果铃铸运行结果The number of 0 in the end of 100!is:24.祷问题的进一步讨论本题的求解程序是正确的,但存在明显的缺点。程序中
20、判断整数 N 包含多少个因子 5 的 方法是与题目中 100 有关的,若题目中的 100 改为 1000,则就要修改程序中求因子5 的数目 的算法了。势思考题修改程序中求因子 5 的数目的算法,使程序可以求出任意 NJ 的末尾有多少个零。8.借书方案知多少小明有五本新书,要借给 A、B、C 三位小朋友,若每人每次只能借一本,则可以有多少种不 同的借法?养问题分析与算法设计本问题实际上是一个排列问题,即求从 5 个中取 3 个进行排列的方法的总数。首先对五本 书从 1 至 5 进行编号,然后使用穷举的方法,假设三个人分别借这五本书中的一本,当三个人 所借的书的编号都不相同时,就是满足题意的一种借
21、阅方法。势程序说明与注释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+)赞穷举第一个人借 5 本书中的 1 本的全部情况替祷穷举第二个人借 5 本书中的 1 本的全部情况祷for (c=l;a!=b&c=2)当 J=l 或 J=N+l 时z其值为 1;当 JI =1 且J!=N+l 时:其值为第 N 一1 行的第 J一1个值与第 N-1 行第J 个值之和 F将这些特
22、点提炼成数学公式可表示为 zc.(x,v)=lc(x-1,y 1)+c(x-1,y)本程序就是根据以上递归的数学表达式编制的。铃程序说明与注释main()int i,j,n=l3;8x=l 或 x=N+l其它16:2.3,117:2 3,418:2.3,519:2.4,120:2.4,321:2.4,522:2.5,123:2.5,324:2.5,425:3.1,226:3.1,427:3.1,528:3.2,129:3.2,430:3.2,531,3,4,136:3.5,441:4.2,346:4,5,151:5.1,432:3,4,237:4.1,242:4.2,547:4.5,252:5
23、,2,133,3,4,538:4.1.,343:4.3,148:4.5,353:5.2,334,3,5,139:4.1,544:4.3,249:5.1,254:5.2,435:3.5.240:4.2,145:4.3,550:5.1,355:5,3,156:5.3,257:.5,3,458:5.4,159:5.4,260:5.4,3print ”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);祷控制输入正确
24、的值以保证屏幕显示的图形正确铃铸控制输出N 行赞铃控制输出第i行前面的空格快祷输出第i行的第 j 个值铃int c(x,y)int x,y;int z;if y=D I I main()int x;print (”Input number:);scanf(%d”,&.x);printf(number of decimal form:%dn”,x);printf(”its binary form:1 1);printb(x,sizeof(int)祷 8);铃 X:整数sizeof(int):int 型在内存中所占的字节数,sizeof(int)秘 8:int 型对应的位数铃putchar(n )
25、;printb (x,n)mt x,n;。if CnO)祷输出整数x 二进制形式的后 n 位铃putchar(O+(unsigned)Cx&Cl (n-1)(n-1);铸输出第n 位祷printb 仗,n 一 1);铃递归调用,输出 x 的后 n-1 位堤L r i,铃运行结果输入:8输出:number of decimal form:8its binary form:0000000000001000输入:8输出:number of decimal form:-8it s binary form:输入:32767输出:number of decimal form:3276710、1it s b
26、inary form:输入:32768输申:number of decimal form:-32768it s binary form:输入:128输出:number of decimal form:128it s binary form:0000000010000000眷问题的进一步讨论充分利用 C 语言可以对位进行操作的特点,可以编写许多其它高级语言不便于编写甚至 根本无法编写的程序。位操作是 C 语言的一大特点,在深入学习 C 语言的过程中应力求很好 掌 握。程序中使用的位运算方法不是最佳的,也可以不用递归操作,读者可自行对程序进行优 化。祷 思 考 题将任意正整数转换为四进制或八进制数
27、。也11第二章生活中的数学问题11.打鱼还是晒网中国有句俗语叫“三天打鱼两天晒网”。某人从 1990 年 1 月 1 日起开始“三天打鱼两天晒 网”,问这个人在以后的某一天中是在“打鱼气还是在“晒网飞势问题分析与算法设计根据题意可以将解题过程分为三步 z汁算从 1990 年 1 月 1 日开始至指定日期一共有多少天;由于“打鱼”和“晒网”的周期为 5 天,所以将计算出的天数用 5 去除 F根据余数判断他是在“打鱼”,还是在“晒网”:若余数为 1、2、3,则他是在“打鱼”否则是在“晒网”。在这三步中,关键是第一步。求从 1990 年 1 月 1 日至指定日期有多少天,要判断经历年份中是否有闰年,
28、若是闰年,二月为 29 天,平年为 28 天。判断闰年的方法可以用伪语句描述如下z1骨如果(年能被 4 除 尽 且 不 能 被 100 除尽)或能被 400 除尽)则该年是闰年 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,&.today.month,&.today
29、.day);铃输入日期特term.month =12;term.day =31;铸设置变量的初始值:月饼铃设置变量的初始值z 日祷for (yearday=O,year=l990;yearO&.day4)printf(快加上指定年中到指定日期的天数祷铃求余数赞铃打印结果祷else print(”He was sleeping at that day.n”);int i,lp;lp =day.year%4=0&.day.year%100!=O 川 day.year%400=O;势判定year 为闰年还是平年,lp=O 为平年,非 0 为闰年讲days(day)struct date day;st
30、atic int day_ tab 2 1 3 =蕃二维数组形式的天数表作为参数祷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 25He was fishing at that day.Enter year/month/day:19
31、92 10 25He was sleeping at that day.Enter year/month/day:1993 10 25He was sleeping at that day.祷思考题请打印出任意年份的日历。12.舰交通肇事犯一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号?只记下车 号的一些特征。甲说:牌照的前两位数字是相同的 F z说:牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。提问题分析与算法设计按照题目的要求造出一个前两位数相同、后两位数相同且相互间又不同的整数,然后判断 该整
32、数是否是另一个整数的平方。铃程序与程序泣释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哇A哇巧i句e,g uONPR 结 行 运U赏AI13.该存多少
33、钱假设银行一年整存零取的月息为 o.63%。现在某人手中有一笔钱,他打算在今后的五年 中每年的年底取出 1000 元,到第五年时刚好取完,请算出他存钱时应存入多少。祷问题 分析与算 法 设计分析存钱和取钱的过程,可以采用倒推的方法。若第五年年底连本带息要取1000 元,则要 先求出第五年年初银行存款的钱数:第五年年初存款1000/(1+12 铃 0.0063)依次类推可以求出第四年、第三年.的年初银行存款的钱数:第四年年初存款(第五年年初存款 1ooo)Io+12 铸 0.0063)第三年年初存款(第四年年初存款 1000)/(1+12 怜 0.0063)第二年年初存款(第三年年初存款 1oo
34、o)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%.2 at first.n ,total);铃 运 仔 结 果He must save 4039.44 at first.,/14.14.怎
35、样存钱利最大 假设银行整存整取存款不同期限的月息利率分别为:0.63%期 限 1年0.66%期限2 年0.69%期 限 3 年o.75%期 限 5 年0.84%期 限 8 年 利息本金月息利率 12存款年限。现在某人手中有 2000 元,请通过计算选择一种存钱方案,使得钱存入银行 20 年后得到的利息最多(假定银行对超过存款期限的那部分时间不付利息)。铃问题分析与算法设计为了得到最多的利息,存入银行的钱应在到期时马上就取出来,然后立刻将原来的本金和 利息加起来再作为新的本金存入银行,这样本利不断地漉动直到满 20 年为止。由于存款的利率不同,所以不同的存款方法(年限)存 20 年得到的利息也是
36、不一样的。分析题意,设 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 =i8 =20 =i5 =(20-8 叫 别 50 =i3 =(20-8 铃 i8二 5 祷 i5)/30 =i 2 =(20-8 祷 i8一5 祷 i 5-3 传 i3)/20#include (ma
37、th.h)main()int i8,i5,i3,i2,il,n8,n5,n3,n2,nl;float max=O,term;for(i8=0;i83;i 8+)for(i5=0;i 5 =(20-8 铃 i8)/5;i s+)for(i3=0;i 3 =(2 0-8 祷 i8-5 铃 i5)/3;i 3+)、祷穷举全部可能的存款方式何for(i2=0;i 2 max)祷 pow(double)(1+3 祷 0.0069 铃 12),(double)i3)铃 pow(double)(1+5 铃 0.0075 铃 12),(douhle).i5)祷 pow(double)(1+8 祷 0.0084
38、 祷 12),(double)i8);祷计算到期时的本利合计蜂长若为最大值,记录存款方式幡max=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 ti
39、mesn”,n3);printf(printf(printf(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 timesmade fixed deposit for 5 year:4 times made fixed d
40、eposit for 3 year:0 timesmade fixed deposit for 2 year:0 timesmade fixed deposit for 1 year:0 timesTotal:8841.01可见最佳存款方案为连续四次存 5 年期。铃思考题某单位对职工出售住房,每套为 2 万元。买房付款的方法是 2一次交清,优惠 20%。从第一年开始,每年年初分期付款:5 年交清,优惠 15%;10 年交清,优惠 lOYo;20 年交清,没有优惠。现在有人手中正好有 2 万元,若假定在今后 20 年中物价和银行利率均保持不变,问他应 当选择哪种付款方式可以使应付的钱最少?15.
41、捕鱼和分鱼A、B、C、D、E 五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方 睡觉。日上三杆,A 第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。B 第16飞.耐 排二个醒来,也将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。C、D、E 依次醒来,也按同 样的方法拿鱼。问他们合伙至少捕了多少条鱼?养问题分析与算法设计 根据题意,总计将所有的鱼进行了五次平均分配,每次分配时的策略是相同的,即扔掉一条后剩下的鱼正好分为五份,然后拿走自己的一份,余下其它四份。假定鱼的总数为 X,则X 可以按照题目的要求进行五次分配:X-1 后可被 5 整除,余下的 鱼为 4 C
42、X-1)5。若X 满足上述要求,则 X 就是题目的解。势程序与程序注释main()int n,i,x,flag=1;for (n=6;flag;n 十)号 flag:控制标记祷铃采用试探的方法,令试探僵 n 逐步加大祷for (x=n,i=1&.flag ;i =5;i 十)头判断是否可以按题目要求进行 5 次分配椅if (x-1)%5 =O)x=4 关(x 一 1)/5;else flag=0;if (flag)break;else flag=1;提若不能分配则置标记 flag=O 退出分配过程悦祷若分配过程正常结束则找到结果退出试探的过程祷养否则继续试探下一个数%printf(Total
43、number of fish catched =%dn”,n);祷输出结果祷祷运行结果Total number of fish catched =3121祷问题的进一步讨论程序采用试探法,试探的初值为 6,每次试探的步长为1。这是过分保守的做法。可以在进 一步深入分析题目的基础上修改初值,增大试探的步长值,以减少试探次数。快思考题请使用其它的方法求解本题。16.出售金鱼买买提将养的一缸金鱼分五次出售:第一次卖出全部的一半加二分之一条 p 第二次卖出余 下的二分之一加三分之一条 z 第三次卖出余下的四分之一加四分之一条 z 第四次卖出余下的五 分之一加五分之一条 p 最后卖出余下的 11 条。问
44、原来鱼缸中共有几条鱼?铸题目分析与算法设计题目中所有的鱼是分五次出售的,每次卖出的策略相同 z 第 j 次卖剩下的(j 十 )分之一再 加 l/(j+l)条。第五次将第四次余下的 11条全卖了。假定第 j 次鱼的总数为 X,则第 j 次留下tx 一 位 D /(j+l)当第四次出售完毕时,应该剩下 11条。若 X 满足上述要求,则 X就是题,昂的解。、应当注意的是:Cx+D I C j十 1)应满足整除条件。试探X 的,初值可以从 23 开始,试探的_.r步长为 2,因为X 的值一定为奇数。保程序说明与注锋main()i n t i,j,n=O,x;for (i=23;n=O;i 十2)for
45、 (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&x=11)祷若满足整除条件则进行实际的出售操作提铸否则停止计算过程铸祷若第四次余下 11 条则满足题意祷;尹输出结果快铃控制退出试探过程祷print(”Thele are%d fishes at first.n ,i);n=l;,普 运 行 结 果There are 59 fishes at first.祷思考题日本著名数学游戏专家中村义作教授提出这样一个问题 z 父亲将 252
46、0 个桔子分给六个儿 子。分完后父亲说:“老大将分给你的桔子的 1/8 给老二;老二拿到后连同原先的桔子分 1/7 给 老三 z 老三拿到后连同原先的桔子分 1/6 给老四:老四拿到后连同原先的桔子分 1/5 给老五 z 老五拿到后连同原先的桔子分 1/4 给老六;老六拿到后连同原先的桔子分 1/3给老大”。结果 大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?17.平分七筐鱼甲、乙、丙三位、渔夫出海打鱼,他们随船带了 21 只箩筐。当晚返航时,他们发现有 7 筐装满 了鱼,还有 7 筐只装了半筐鱼,另外 7 筐则是空的。由于他们没有秤,只好通过目测认为 7 个满筐鱼的重量是相等的,7
47、 个半筐鱼的重量是相等的。在不将鱼倒出来的前提下,怎样将鱼和筐 平分为三份?势问题分析与算法设计根据题意可以,知道:每个人应分到七个箩筐,其中有 3.5 筐鱼。采用一个 33 的数组a 来 表示三个人分到的东西。其中每个人对应数组 a 的一行,数组的第 0 列放分到的鱼的整筐数,数组的第 1列放分到的半筐数,数组的第 2 列放分到的空筐数。由题目可以推出:数组的每行或每列的元素之和都为 7;对数组的行来说,满筐数十半筐数3.5;每个人所得到的满筐数不能超过 3 筐 z每个人都必须至少有1个半筐,且半筐数一定为奇数 对于找到的某种分鱼方案,三个人谁拿哪一份都是相同的。为了避免出现重复的分配方案,
48、可以规定 E 第二个人的满筐数大于等于第一个人的满筐数 F 第二个人的半筐数大于等于第18一个人的半筐数。并程序与程序注锋 int a33,count;main()int i,j,k,m,n,flag;printf(叮 t exists possible distribution plans:n);for (i=O;i =3;i 十)铃试探第一个人满筐aOO的值,满筐数不能 3 祷 aOO=i;for (j=i;j =7-i&.&.i 3 )continue;椅第三个人满筐数不能3 铃 if (a20alO )break;提要求后一个人分的满筐数前一个人,以排除重复情况祷for 他 l;k =
49、5;k+=2)aO l =k;for (m=l;m 7-k;m+=2)al l =m;a 2 1 =7-k-m;长试探半筐aOi 的值,半筐数为奇数铃骨试探半筐al 1的值,半筐数为奇数铃for (flag=l,n=O;flag&.&.n3;n 十)蕃判断每个人分到的鱼是否为 3.5 筐,flag 为满足题意的标记变量锵if (ano+an17&.&.anO 铃 2十anl=7 )an2 =7-ano a n l i二lse flag=O;羡计算应得到的空筐数量祷养不符合题意则置标记为 0 讲 if (flag)printf(”No.%d铸若符合题意则输出每个人的分配情况铃Full baske
50、t Semi-basket Empty n”,count);A+n,anO,anl,an 2);19-for(n=O;n3;n+)printf(”fisher%c:%d%d%dn,岳运行结果It exists.possible distribution plans:No.lFull basketSemi-basketEmptyNo.2Full basketSemi-basketEmpty、祷思考题宴会上数学家出了道难题:假定桌子上有三瓶啤酒,将每瓶中的酒平分给几个人喝,但 喝各瓶酒的人数是不一样的,不过其中有一个人喝了每一瓶中的酒,且加起来刚肝是一瓶,请 问喝这三瓶酒的各有多少人?(答案:喝三