趣味编程题整理及答案

余年寄山水
943次浏览
2020年09月29日 07:50
最佳经验
本文由作者推荐

笔记本电脑出租-2015年高考时间

2020年9月29日发(作者:巴曙松)


1.抓交通肇事犯
一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没 有记住车号,只记下车
号的一些特征
。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;
丙是数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。
*问题分析与算法设计
按照题目的要求造出一个前两位数相同、后两位数相同且相互间又不同 的整数,然后判断该
整数是否是另一个整数的平方。
*程序说明与注释
#include<>
#include<>
int main()
{
int i,j,k,c;
for(i=1;i<=9;i++) *i:车号前二位的取值*
for(j=0;j<=9;j++) *j:车号后二位的取值*
if(i!=j) *判断二位数字是否相异*
{
k=i*1000+i*100+j*10+j; *计算出可能的整数*
for(c=31;c*cif(c*c==k) printf(–No. is %d.n若是,打印结果*
}
}
*运行结果
Lorry 7744
2.百钱百鸡问题
中 国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱
五,鸡母一,值 钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
*问题分析与算法设计
设鸡翁 、鸡母、鸡雏的个数分别为x,y,z,题意给定共100钱要买百鸡,若全买公鸡最多买
20只,显然 x的
值在0~20之间;同理,y的取值范围在0~33之间,可得到下面的不定方程:
5x+3y+z3=100
x+y+z=100
所以此问题可归结为求这个不定方程的整数解。
由程序设计实现不定方程的求解与手工计算不 同。在分析确定方程中未知数变化范围的前提
下,可通过对
未知数可变范围的穷举,验证方程在什么情况下成立,从而得到相应的解。
*程序说明与注释
#include<>
int main()
{
int x,y,z,j=0;
printf(


for(x=0;x<=20;x++) *外层循环控制鸡翁数*
for(y=0;y<=33;y++) *内层循环控制鸡母数y在0~33变化*
{
z=100-x-y; *内外层循环控制下,鸡雏数z的值受x,y的值的制约*
if(z%3==0&&5*x+3*y+z3==100)
*验证取z值的合理性及得到一组解的合理性*
printf(
}
}
3.三色球问题
若一个口袋中放有12个球,其中有3个红的。3个白的和6个黒的,问从中 任取8个共有
多少种不同的颜色搭
配?
*问题分析与算法设计
设任取的 红球个数为i,白球个数为j,则黒球个数为8-i-j,根据题意红球和白球个数的
取值范围是0~3 ,
在红球和白球个数确定的条件下,黒球个数取值应为8-i-j<=6。
*程序说明与注释
#include<>
int main()
{
int i,j,count=0;
printf(
printf(n
for(i=0;i<=3;i++) *循环控制变量i控制任取红球个数0 ̄3*
for(j=0;j<=3;j++) *循环控制变量j控制任取白球个数0 ̄3*
if((8-i-j)<=6)
printf(
}
4.马克思手稿中的数学题
马克思手稿中有一道趣味数学问题:有30个人,其中有男人、女 人和小孩,在一家饭馆吃
饭花了50先令;每个男人花3先令,每个女人花2先令,每个小孩花1先令; 问男人、女
人和小孩各有几人?
*问题分析与算法设计
设x,y,z分别代表男人、女人和小孩。按题目的要求,可得到下面的方程:
x+y+z=30 (1)
3x+2y+z=50 (2)
用方程程序求此不定方程的非负整数解,可先通过(2)-(1)式得:
2x+y=20 (3)
由(3)式可知,x变化范围是0~10
*程序说明与注释
#include<>
int main()
{


int x,y,z,count=0;
printf(
printf(
for(x=0;x<=10;x++)
{
y=20-2*x; *x定值据(3)式求y*
z=30-x-y; *由(1)式求z*
if(3*x+2*y+z==50) *当前得到的一组解是否满足式(2)*
printf(
}
}
5.新娘和新郞
三对情侣参加婚礼,三 个新郞为A、B、C,三个新娘为X、Y、Z。有人不知道谁和谁结婚,
于是询问了六位新人中的三位, 但听到的回答是这样的:A说他将和X结婚;X说她的未婚
夫是C;C说他将和Z结婚。这人听后知道他 们在开玩笑,全是假话。请编程找出谁将和谁
结婚。
*问题分析与算法设计
将A、 B、C三人用1,2,3表示,将X和A结婚表示为“X=1”,将Y不与A结婚表示为“Y!=1”。
按照题目中的叙述可以写出表达式:
x!=1 A不与X结婚
x!=3 X的未婚夫不是C
z!=3 C不与Z结婚
题意还隐含着X、Y、Z三个新娘不能结为配偶,则有:
x!=y且x!=z且y!=z
穷举以上所有可能的情况,代入上述表达式中进行推理运算, 若假设的情况使上述表达式的
结果均为真,则假设情况就是正确的结果。
*程序说明与注释
#include<>
int main()
{
int x,y,z;
for(x=1;x<=3;x++) *穷举x的全部可能配偶*
for(y=1;y<=3;y++) *穷举y的全部可能配偶*
for(z=1;z<=3;z++) *穷举z的全部可能配偶*
if(x!=1&&x!=3&&z!=3&&x!=y&&x!=z&&y!=z) *判断配偶是否满足题意*
{
printf(打印判断结果*
printf(
printf(
}
}
*运行结果
X will marry to B. (X与B结婚)
Y will marry to C. (Y与C结婚)


Z will marry to A. (Z与A结婚)
6.委派任务 < br>某侦察队接到一项紧急任务,要求在A、B、C、D、E、F六个队员中尽可能多地挑若干人,
但 有以下限制条件:
1)A和B两人中至少去一人;
2)A和D不能一起去;
3)A、E和F三人中要派两人去;
4)B和C都去或都不去;
5)C和D两人中去一个;
6)若D不去,则E也不去。
问应当让哪几个人去?
*问题分析与算法设计
用A、B、C、D、E、F六个变量表示六个人是否去执行任务的状态 ,变量的值为1,则表示
该人去;变量的值为0,则表示该人不参加执行任务,根据题意可写出表达式:
a+b>1 A和B两人中至少去一人;
a+d!=2 A和D不能一起去;
a+e+f==2 A、E、F三人中要派两人去;
b+c==0或b+c==2 B和C都去或都不去;
c+d==1 C和D两人中去一个;
d+e==0或d==1 若D不去,则E也不去(都不去;或D去E随便)。
上述各表达式之间的关系为“与”关系。穷举每个 人去或不去的各种可能情况,代入上述表
达式中进行推理运算,使上述表达式均为“真”的情况就是正确 的结果。
*程序说明与注释
#include<>
int main()
{
int a,b,c,d,e,f;
for(a=1;a>=0;a--) *穷举每个人是否去的所有情况*
for(b=1;b>=0;b--) *1:去 0:不去*
for(c=1;c>=0;c--)
for(d=1;d>=0;d--)
for(e=1;e>=0;e--)
for(f=1;f>=0;f--)
if(a+b>=1&&a+d!=2&&a+e+f==2
&&(b+c==0||b+c==2)&&c+d==1
&&(d+e==0||d==1))
{
printf(
printf(
printf(
printf(
printf(
printf(
}


}
*运行结果
A will be assigned. (去)
B will be assigned. (去)
C will be assigned. (去)
D will not be assigned. (不去)
E will not be assigned. (不去)
F will be assigned. (去)
7.50.谁在说谎
张三说李 四在说谎,李四说王五在说谎,王五说张三和李四都在说谎。现在问:这三人中到
底谁说的是真话,谁说 的是假话?
*问题分析与算法设计
分析题目,每个人都有可能说的是真话,也有可能说的是 假话,这样就需要对每个人所说的
话进行分别判断。假设三个人所说的话的真假用变量A、B、C表示, 等于1表示该人说的是
真话; 表示这个人说的是假话。由题目可以得到:
*张三说李四在说谎 张三说的是真话:a==1&&b==0
或 张三说的是假话:a==0&&b==1
*李四说王五在说谎 李四说的是真话:b==1&&c==0
或 李四说的是假话:b==0&&c==1
*王五说张三和李四都在说谎 王五说的是真话:c==1&&a+b==0
或 王五说的是假话:c==0&&a+b!=0
上述三个条件之间是“与”的关系。将表达式进行整理就可得到C语言的表达式:
(a&&! b||!a&&b)&&(b&&!c||!b&&c)&&(c&&a+b==0||!c&&a+b!=0)
穷举每个人说真话或说假话的各种可能情况,代入上述表达式中进行推理运算,使上述表达
式均 为“真”的情况就是正确的结果。
*程序说明与注释
#include<>
int main()
{
int a,b,c;
for(a=0;a<=1;a++)
for(b=0;b<=1;b++)
for(c=0;c<=1;c++)
if((a&&!b||!a&&b)&&(b&&! c||!b&&c)&&(c&&a+b==0||!c&&a+b!=0))
{
printf(
printf(
printf(
}
}
*运行结果
Zhangsan told a lie (张三说假话)
Lisi told a truch. (李四说真话)
Wangwu told a lie. (王五说假话)


8.黑与白
有A、B、C、D、E五人,每人额头上都帖了 一张黑或白的纸。五人对坐,每人都可以看到其
它人额头上的纸的颜色。五人相互观察后,
A说:“我看见有三人额头上帖的是白纸,一人额头上帖的是黑纸。”
B说:“我看见其它四人额头上帖的都是黑纸。”
C说:“我看见一人额头上帖的是白纸,其它三人额头上帖的是黑纸。”
D说:“我看见四人额头上帖的都是白纸。”
E什么也没说。
现在已知额头上帖黑 纸的人说的都是谎话,额头帖白纸的人说的都是实话。问这五人谁的额
头是帖白纸,谁的额头是帖黑纸?
*问题分析与算法设计
假如变量A、B、C、D、E表示每个人额头上所帖纸的颜色,0 代表是黑色,1 代表是白色。
根据题目中A、B、C、D四人所说的话可以总结出下列关系:
A说: a&&b+c+d+e==3||!a&&b+c+d+e!=3
B说: b&&a+c+d+e==0||!b&&a+c+d+e!=0
C说: c&&a+b+d+e==1||!c&&a+b+d+e!=1
D说: d&&a+b+c+e==4||!d&&a+b+c+e!=4
穷举每个人额头所帖纸的颜色的所有 可能的情况,代入上述表达式中进行推理运算,使上述
表达式为“真”的情况就是正确的结果。
*程序说明与注释
#include<>
int main()
{
int a,b,c,d,e;
for(a=0;a<=1;a++) *黑色:0 白色:1*
for(b=0;b<=1;b++) *穷举五个人额头帖纸的全部可能*
for(c=0;c<=1;c++)
for(d=0;d<=1;d++)
for(e=0;e<=1;e++)
if((a&&b+c+d+e==3||!a&&b+c+d+e!=3)
&&(b&&a+c+d+e==0||!b&&a+c+d+e!=0)
&&(c&&a+b+d+e==1||!c&&a+b+d+e!=1)
&&(d&&a+b+c+e==4||!d&&a+b+c+e!=4))
{
printf(
a?
printf(
b?
printf(
c?
printf(
d?
printf(
e?


}
}
*运行结果
A is pasted a paper of black paper on his forehead. (黑)
B is pasted a paper of black paper on his forehead. (黑)
C is pasted a paper of white paper on his forehead. (白)
D is pasted a paper of black paper on his forehead. (黑)
E is pasted a paper of white paper on his forehead. (白)
9.诚实族和说谎族是 来自两个荒岛的不同民族,诚实族的人永远说真话,而说谎族的人永
远说假话。迷语博士是个聪明的人, 他要来判断所遇到的人是来自哪个民族的。
迷语博士遇到三个人,知道他们可能是来自诚实族或说谎族 的。为了调查这三个人是什么族
的,博士分别问了他们的问题,这是他们的对话:
问第一个人 :“你们是什么族?”,答:“我们之中有两个来自诚实族。”第二个人说:“不要
胡说,我们三个人中 只有一个是诚实族的。”第三个人听了第二个人的话后说:“对,就是只
有一个诚实族的。”
请根据他的回答判断他们分别是哪个族的。
*问题分析与算法设计
假设这三个人分 别为A、B、C,若说谎其值为0,若诚实,其值为1。根据题目中三个人的
话可分别列出:
第一个人: a&&a+b+c==2||!a&&a+b+c!=2
第二个人: b&&a+b+c==1||!b&&a+b+c!=1
第三个人: c&&a+b+c==1||!c&&a+b+c!=1
利用穷举法,可以很容易地推出结果。
*程序说明与注释
#include<>
int main()
{
int a,b,c;
for(a=0;a<=1;a++) *穷举每个人是说谎还是诚实的全部情况*
for(b=0;b<=1;b++) *说谎:0 诚实:1*
for(c=0;c<=1;c++)
if((a&&a+b+c==2||!a&&a+b+c!=2) *判断是否满足题意*
&&(b&&a+b+c==1||!b&&a+b+c!=1)
&&(c&&a+b+c==1||!c&&a+b+c!=1))
{
printf(输出判断结果*
printf(
printf(
}
}
*运行结果
A is a lier (说谎族)
B is a lier (说谎族)
C is a lier (说谎族)


10. 角谷猜想
日本一位中学生发现一个奇妙的“定理”,请角谷教授证明,而教授无能为力,于是产生角< br>谷猜想。猜想的内容是:任给一个自然数,若为偶数除以2,若为奇数则乘3加1,得到一
个新的 自然数后按照上面的法则继续演算,若干次后得到的结果必然为1。请编程验证。
*问题分析与算法设计
本题是一个沿未获得一般证明的猜想,但屡试不爽,可以用程序验证。
题目中给出的处理过程很清楚,算法不需特殊设计,可按照题目的叙述直接进行证。
*程序说明与注释
#include<>
int main()
{
int n,count=0;
printf(
scanf(输入任一整数*
do{
if(n%2)
{
n=n*3+1; *若为奇数,n乘3加1*
printf(
}
else
{
n=2; *若为偶数n除以2*
printf(
}
}while(n!=1); *n不等于1则继续以上过程*
}
11.常胜将军
现有21根火柴,两人轮流取,每人每次可以取走1至4根,不可多取,也不能不取,谁取
最后 一楰火柴谁输。请编写一个程序进行人机对弈,要求人先取,计算机后取;计算机一方
为“常胜将军”。
*问题分析与算法设计
在计算机后走的情况下,要想使计算机成为“常胜将军”,必须找出取 关键。根据本题的要
求枷以总结出,后走一方取子的数量与对方刚才一步取子的数量之和等于,就可以保 证最后
一个子是留给先取子的那个人的。
据此分析进行算法设计就是很简单的工作,编程实现也十分容易。
*程序说明与注释
#include<>
int main()
{
int a=21,i;
printf(
while(a>0)
{


do{
printf(
scanf(
}while(i>4||i<1||i>a); *接收正在确的输入*
if(a-i>0) printf(
if((a-i)<=0)
{
printf(
printf(输出取胜标记*
break;
}
else
printf(输出计算机取的子数*
a-=5;
printf(
}
}
12.

缝扣子-大清皇帝列表


丰台区人事局-像什么像什么造句


洛克菲勒大学-证券从业资格预约考试报名入口


沈阳农业大学地址-入党谈话内容


广西师大附中-机关个人工作总结


分数的基本性质教学设计-移动业务查询


随遇而安的意思-重要举措


衡阳教育信息网-西班牙住宿