如果M/N是无限循环小数,则计算并输出它的第一循环节,同时要求输出循环节的起止位置(小数位的序号。
)
提示:
可将商存放在一维数组中,进行除法运算时,可模拟人的手工操作,即每次求出商的一位后,将余数乘以10,再计算商的下一位。
若某次余数为0,则为有限不循环小数。
若某次计算后的余数与前面的某个余数相同时,则M/N是无限循环小数。
6.马克思手稿中的数学题(穷举算法)
马克思手稿中有一道趣味数学题:
有30个人,其中有男人、女人和小孩,在一家饭馆吃饭共花了50先令:
每个男人花3先令,每个女人花2先令,每个小孩花1先令,问男人、女人、小孩各有几人?
7.小孩吃梨问题
小孩买了一些梨,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的梨吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半,并又多吃了一个。
到第18天只剩下一个梨了,问小孩共买了多少梨?
提示:
据初始条件,用倒推法。
8.奇异的三位数
一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这两个三位数的数码顺序正好相反,求这个三位数。
9.约瑟夫问题
15个基督徒和15个异教徒在海上遇险,必须将一半的人投入大海,其余的人才能幸免于难,于是想了一个办法:
30个人围成一个圆圈,从第一个人开始依次报数,每数到第9个人就将他扔入大海,如此循环直到仅余15个人为止。
问怎样排法,才能使每次投入大海的都是异教徒。
程序输出要求:
程序运行后,显示原始顺序,每次投入大海的人的信息及剩下人的顺序。
提示:
①30个人顺序编号,自增量k报数,k%9==0时,此人投入大海。
投入大海标志为置数组元素值为0(或-1)。
投入大海的人不再报数。
二、提高训练题
1.回文数的形成
任取一个十进制整数,将其倒过来后与原来的整数相加,得到一个新的整数后重复以上步骤,则最终可得到一个回文数。
请编程验证。
(回文数就是将一个数从左向右读是一样的,如121,11等)。
(注:
回文数不超过)
回文数的这一形成规则目前还属于一个猜想,尚未获得数学上的验证,有些回文数要经历上百个步骤才能获得,请编程验证,打印形成过程。
如输入整数78,则形成回文数的过程为:
78+87=165,165+561=726,726+627=1353,1353+3531=4884。
提示:
一个函数用来求反序数,另一个函数判断是否为回文数,在主函数中输入输出。
2.人机猜数游戏1
由计算机“想”一个四位数,请人猜这个四位数是多少。
人输入这个四位数后,计算机首先判断这四个数中有几个猜对了,并且在猜对的数字中又有几位位置也是对的,将结果显示出来,给人以提示,请人再猜,直到人猜出计算机所想的四位数为止。
请编程实现该游戏,游戏结束时,显示人猜一个数用了几次。
提示:
用库函数随机数发生器函数random()产生一个随机数的用法
函数原型:
intrandom(intnum);
程序例:
#include/*包含库函数random()的头文件*/
#include
/*printsarandomnumberintherange0to99*/
intmain(void){
intn;
randomize();/*初始化随机数发生器*/
n=random(100);/*产生一个0-100的随机数。
*/
printf("Randomnumberinthe0-99range:
%d\n",n);
;
}
3.人机猜数游戏2
程序说明:
游戏的开始由机器产生一个随机数(1~100之间,用库函数random()),然后游戏者在程序的提示下猜数,若输入的数比这个数大,程序提示:
YouranswerisHIGH,tryagain.,否则,程序提示:
YouranswerisLOW,tryagain.,直到猜对为止。
程序可实现连续猜数,直到游戏者退出。
程序输出要求:
累计游戏者猜对一个数所需次数n,当n<=7时,给出“Congratulation”字样;当7<n<15时,给出“I canbetyoucandoitbetter.”;当n>=15时,用exit(0)库函数退出程序。
4.保龄球计分程序
打保龄球是用一个滚球去撞击10个站立的瓶,将瓶击倒。
一局分10轮,每轮可滚球1次或多次,以击到的瓶数为依据计分,一局得分为10轮得分之和,而每轮的得分不仅与本轮的滚球情况有关,还可能与后一轮或两轮的滚球情况有关,即:
某轮某次滚球击倒的瓶数不仅要计入本轮得分,还可能会计入前一轮或两轮得分。
计分规则如下:
1若某一轮的第一次滚球就击倒全部10个瓶,则本轮不再滚球(若是第10轮还需加2次滚球),该轮得分为本次击倒瓶数10与以后2次滚球所击倒瓶数之和。
2若某一轮的第一次滚球未击倒全部10个球,则对剩下未击倒的瓶再滚球一次,如果这2次滚球击倒全部10个瓶,则本轮不再滚球(若是第10轮还需加1次滚球),该轮得分为这2次击倒瓶数10与以后1次滚球所击倒瓶数之和。
3若某一轮2次滚球未击倒全部10个瓶,则本轮不在滚球,该轮得分为这2次滚球所击倒瓶数之和。
实现提示
1模拟10个人各打一局保龄球比赛过程,统计每局各轮得分和累计总分。
2逐人逐轮逐次输入一次滚球击倒的瓶数。
3对10人的得分由低到高排序并显示。
4最后,把排序的存入文件中。
5.简单计算器
请编写一个程序计算表达式:
data1opdata2的值。
其中,op为运算符+、-、*、/。
三、综合训练题
1.学生成绩管理系统
(结构体数组、函数、指针、链表及文件等的综合应用)
程序说明:
有N个学生,每个学生的数据包含学号(不重复)、姓名、三门课的成绩及平均成绩,试设计一学生成绩管理系统,使之能提供以下功能:
(1)成绩录入,插入后按学号自动排序,创建链表;
(2)成绩文件的存取,创建链表;
(3)成绩的多种查询、修改;
(4)成绩的多种统计、排序;
(5)学生增加、删除、列表。
提示:
intnum;/*定义学号*/
charname[20];/*定义姓名*/
floatscore[3];/*定义存贮三门课成绩的数组*/
floataverage;/*定义平均成绩*/
2.电话簿/通讯录的管理系统
类似学生成绩管理系统,要求有结构体数组、函数、指针、链表及文件等的综合应用。
具有:
增加、删除、查询、修改、统计、排序、列表等功能。
3.迷宫问题
利用栈的先进后出的深度优先搜索,找出一条路径。
4.背包问题
设有不同价值,不同重量的物品n件,求从这n件物品中选取一部分物品的方案,使选中物品的总重量不超过指定的限制重量,且选中物品的价值之和为最大。
算法思想:
设n件物品的重量分别为w0,w1,……,wn-1,物品的价值分别为v0,v1,…,vn-1。
采用递归寻找物品的选择方案。
设前面已有了多种选择的方案,并保留了其中总价值最大的方案于数组option[],该方案的总价值存于变量maxv。
当前正在考察新方案,其物品选择情况保存于数组成cop[]。
假定当前方案已考虑了前i-1件物品,现在要考虑第i件;当前方案已包含的物品的重量之和为tw;至此,若其余物品都选择是可能的话,本方案达到的总价值的期望值设为tv。
算法引入tv是当一旦前方案的总价值的期望值也小于前面方案的总价值maxv时,继续考察当前方案变成无意义的工作,应当终止当前方案,立即去考察下一个方案。
因为当方案的总价值不比maxv大时,该方案不会再被考察。
这同时保证函数后找到的方案比前面的方案更好。
对于第i件物品的选择有两种可能:
(1)物品i被选择,这种可能性仅当包含它不会超过方案总重量的限制时才是可行的。
选中后,继续递归去考虑其余物品的选择。
(2)物品i不被选择,这种可能性仅当不包含物品也有可能会找到价值更大的方案的情况。
算法:
try(物品i,当前选择已达到的重量和tw,本方案可能达到的总价值为tv){
/*考虑物品i包含在当前方案中的可能性*/
if(包含物品i是可接受的){
将物品i包含在当前方案中;
if(itry(i+1,tw+物品i的重量,tv);
else
/*又一个完整方案,因它比前面的方案好,以它作为最佳方案*/
以当前方案作为临时最佳方案保存;
恢复物品i不包含状态;
}
/*考虑物品i不包含在当前方案中的可能性*/
if(不包含物品i仅是可考虑的)
if(itry(i+1,tw,tv-物品i的价值);
else
/*又一个完整方案,因它比前面的方案好,以它作为最佳方案*/
以当前方案作为临时最佳方案保存;}
5.八皇后问题
求出在一个n*n的棋盘上,放置n个不能互相捕捉的国际象棋“皇后”的所有布局。
这是来源于国际象棋的一个问题。
皇后可以沿着纵横和两条斜线四个方向相互捕捉。
如图1所示,一个皇后放在棋盘第四行第三列位置上,则棋盘上凡打星号“*”的位置上的皇后就能与第四行第三列位置上的皇后相互捕捉。
从图1得到以下启示,一个合适的解应使得每行.每列上确定有一个皇后,且在一条斜线上也最多只有一个皇后。
*
*
*
*
*
*
*
*
*
*
Q
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
图1皇后相互捕捉位置示意图
算法思想:
求解过程从空配置开始,在第1列至第m列为合理配置的基础上,再配置第m+1列。
直至第n列配置也是合理时,就找到了一个解。
接着改变第n列配置,希望获得下一个解。
另外,在任一列上,可能性有n种配置。
开始时,配置在第一行,以后改变时。
顺次选择第二.第三……直到第n行。
当直至第n行也找不到一个合理的配置时,就要回溯,去改变前一列的配置。
求解皇后问题的算法如下。
算法:
{输入棋盘大小值n;/*一个n*n的棋盘*/
m=0;/*从空配置开始*/
good=1;/*空配置皇后不相互捕捉*/
do{
if(good)
if(m==n){
输出解;
改变之,形成下一个侯选解;
}
else
扩展当前侯选解至下一列;
else
改变之,形成下一侯选解;
good=检查当前侯选解的合理性;
}while(m!
=0)
}
随机模拟问题
某公司有一个顾客接待站,在单位时间内随机的有n位顾客到接待站来询问。
设每位顾客的接待时间是某个范围内的随机值。
假设接待站只有一位接待员,要求程序模拟统计在设定时间内,接待员的总空闲时间和顾客的平均等待时间。
假定模拟数据已按顾客到达接待站的时间顺序依次存放在某个数据文件中,对应每位顾客有两个数据,到达时间和需要接待的时间。
提示:
(1)单位时间可设为一个工作日8小时,可折合成28800秒,则接待员的工作时间为第0秒至第28800秒。
(2)顾客的到达时间也可用秒作为单位。
由于顾客必须在单位时间内到达故取值范围应在0-28800之间。
(3)可用随机函数rand()或random()取得顾客的到达时间和需接待时间。
(4)需事先建立顾客数据文件customs_data(二进制文件),并将顾客数据按到达接待站的时间顺序排序。