趣味编程题整理及答案Word下载.docx
- 文档编号:20574835
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:13
- 大小:20.11KB
趣味编程题整理及答案Word下载.docx
《趣味编程题整理及答案Word下载.docx》由会员分享,可在线阅读,更多相关《趣味编程题整理及答案Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
设鸡翁、鸡母、鸡雏的个数分别为x,y,z,题意给定共100钱要买百鸡,若全买公鸡最多买20只,显然x的
值在0~20之间;
同理,y的取值范围在0~33之间,可得到下面的不定方程:
5x+3y+z/3=100
x+y+z=100
所以此问题可归结为求这个不定方程的整数解。
由程序设计实现不定方程的求解与手工计算不同。
在分析确定方程中未知数变化范围的前提下,可通过对
未知数可变范围的穷举,验证方程在什么情况下成立,从而得到相应的解。
intx,y,z,j=0;
printf("
Folleingarepossibleplanstobuy100fowlswith100Yuan.\n"
);
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+z/3==100)
/*验证取z值的合理性及得到一组解的合理性*/
%2d:
cock=%2dhen=%2dchicken=%2d\n"
++j,x,y,z);
3.三色球问题
若一个口袋中放有12个球,其中有3个红的。
3个白的和6个黒的,问从中任取8个共有多少种不同的颜色搭
配?
设任取的红球个数为i,白球个数为j,则黒球个数为8-i-j,根据题意红球和白球个数的取值范围是0~3,
在红球和白球个数确定的条件下,黒球个数取值应为8-i-j<
=6。
inti,j,count=0;
REDBALLWHITEBALLBLACKBALL\n"
…………………………………………..\n"
for(i=0;
=3;
i++)/*循环控制变量i控制任取红球个数0 ̄3*/
j++)/*循环控制变量j控制任取白球个数0 ̄3*/
if((8-i-j)<
=6)
%2d:
%d%d%d\n"
++count,i,j,8-i-j);
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
intx,y,z,count=0;
MenWomenChildren\n"
........................................\n"
=10;
x++)
y=20-2*x;
/*x定值据(3)式求y*/
z=30-x-y;
/*由
(1)式求z*/
if(3*x+2*y+z==50)/*当前得到的一组解是否满足式
(2)*/
++count,x,y,z);
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!
=1A不与X结婚
=3X的未婚夫不是C
z!
=3C不与Z结婚
题意还隐含着X、Y、Z三个新娘不能结为配偶,则有:
=y且x!
=z且y!
=z
穷举以上所有可能的情况,代入上述表达式中进行推理运算,若假设的情况使上述表达式的结果均为真,则假设情况就是正确的结果。
intx,y,z;
for(x=1;
x++)/*穷举x的全部可能配偶*/
for(y=1;
y++)/*穷举y的全部可能配偶*/
for(z=1;
z<
z++)/*穷举z的全部可能配偶*/
if(x!
=1&
=3&
=y&
=z&
y!
=z)/*判断配偶是否满足题意*/
Xwillmarryto%c.\n"
'
A'
+x-1);
/*打印判断结果*/
Ywillmarryto%c.\n"
+y-1);
Zwillmarryto%c.\n"
+z-1);
XwillmarrytoB.(X与B结婚)
YwillmarrytoC.(Y与C结婚)
ZwillmarrytoA.(Z与A结婚)
6.委派任务
某侦察队接到一项紧急任务,要求在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>
1A和B两人中至少去一人;
a+d!
=2A和D不能一起去;
a+e+f==2A、E、F三人中要派两人去;
b+c==0或b+c==2B和C都去或都不去;
c+d==1C和D两人中去一个;
d+e==0或d==1若D不去,则E也不去(都不去;
或D去E随便)。
上述各表达式之间的关系为“与”关系。
穷举每个人去或不去的各种可能情况,代入上述表达式中进行推理运算,使上述表达式均为“真”的情况就是正确的结果。
inta,b,c,d,e,f;
for(a=1;
a>
=0;
a--)/*穷举每个人是否去的所有情况*/
for(b=1;
b>
b--)/*1:
去0:
不去*/
for(c=1;
c>
c--)
for(d=1;
d>
d--)
for(e=1;
e>
e--)
for(f=1;
f>
f--)
if(a+b>
=2&
a+e+f==2
(b+c==0||b+c==2)&
c+d==1
(d+e==0||d==1))
Awill%sbeassigned.\n"
a?
"
:
not"
Bwill%sbeassigned.\n"
b?
Cwill%sbeassigned.\n"
c?
Dwill%sbeassigned.\n"
d?
Ewill%sbeassigned.\n"
e?
Fwill%sbeassigned.\n"
f?
Awillbeassigned.(去)
Bwillbeassigned.(去)
Cwillbeassigned.(去)
Dwillnotbeassigned.(不去)
Ewillnotbeassigned.(不去)
Fwillbeassigned.(去)
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&
=0)
穷举每个人说真话或说假话的各种可能情况,代入上述表达式中进行推理运算,使上述表达式均为“真”的情况就是正确的结果。
inta,b,c;
for(a=0;
a<
=1;
a++)
for(b=0;
b<
b++)
for(c=0;
c<
c++)
if((a&
=0))
Zhangsantolda%s.\n"
truth"
lie"
Lisitolda%s.\n"
truch"
Wangwutolda%s.\n"
Zhangsantoldalie(张三说假话)
Lisitoldatruch.(李四说真话)
Wangwutoldalie.(王五说假话)
8.黑与白
有A、B、C、D、E五人,每人额头上都帖了一张黑或白的纸。
五人对坐,每人都可以看到其它人额头上的纸的颜色。
五人相互观察后,
A说:
“我看见有三人额头上帖的是白纸,一人额头上帖的是黑纸。
”
B说:
“我看见其它四人额头上帖的都是黑纸。
C说:
“我看见一人额头上帖的是白纸,其它三人额头上帖的是黑纸。
D说:
“我看见四人额头上帖的都是白纸。
E什么也没说。
现在已知额头上帖黑纸的人说的都是谎话,额头帖白纸的人说的都是实话。
问这五人谁的额头是帖白纸,谁的额头是帖黑纸?
假如变量A、B、C、D、E表示每个人额头上所帖纸的颜色,0代表是黑色,1代表是白色。
根据题目中A、B、C、D四人所说的话可以总结出下列关系:
a&
b+c+d+e==3||!
b+c+d+e!
=3
b&
a+c+d+e==0||!
a+c+d+e!
c&
a+b+d+e==1||!
a+b+d+e!
=1
d&
a+b+c+e==4||!
d&
a+b+c+e!
=4
穷举每个人额头所帖纸的颜色的所有可能的情况,代入上述表达式中进行推理运算,使上述表达式为“真”的情况就是正确的结果。
inta,b,c,d,e;
a++)/*黑色:
0白色:
1*/
b++)/*穷举五个人额头帖纸的全部可能*/
for(d=0;
d<
d++)
for(e=0;
e<
e++)
=3)
=1)
(d&
=4))
Aispastedapieceof%spaperonhisforehead.\n"
a?
white"
black"
Bispastedapieceof%spaperonhisforehead.\n"
b?
Cispastedapieceof%spaperonhisforehead.\n"
c?
Dispastedapieceof%spaperonhisforehead.\n"
d?
Eispastedapieceof%spaperonhisforehead.\n"
e?
Aispastedapaperofblackpaperonhisforehead.(黑)
Bispastedapaperofblackpaperonhisforehead.(黑)
Cispastedapaperofwhitepaperonhisforehead.(白)
Dispastedapaperofblackpaperonhisforehead.(黑)
Eispastedapaperofwhitepaperonhisforehead.(白)
9.诚实族和说谎族是来自两个荒岛的不同民族,诚实族的人永远说真话,而说谎族的人永远说假话。
迷语博士是个聪明的人,他要来判断所遇到的人是来自哪个民族的。
迷语博士遇到三个人,知道他们可能是来自诚实族或说谎族的。
为了调查这三个人是什么族的,博士分别问了他们的问题,这是他们的对话:
问第一个人:
“你们是什么族?
”,答:
“我们之中有两个来自诚实族。
”第二个人说:
“不要胡说,我们三个人中只有一个是诚实族的。
”第三个人听了第二个人的话后说:
“对,就是只有一个诚实族的。
请根据他的回答判断他们分别是哪个族的。
假设这三个人分别为A、B、C,若说谎其值为0,若诚实,其值为1。
根据题目中三个人的话可分别列出:
第一个人:
a+b+c==2||!
a+b+c!
=2
第二个人:
a+b+c==1||!
第三个人:
利用穷举法,可以很容易地推出结果。
a++)/*穷举每个人是说谎还是诚实的全部情况*/
b++)/*说谎:
0诚实:
=2)/*判断是否满足题意*/
=1))
Aisa%s.\n"
honest"
lier"
/*输出判断结果*/
Bisa%s.\n"
Cisa%s.\n"
Aisalier(说谎族)
Bisalier(说谎族)
Cisalier(说谎族)
10.角谷猜想
日本一位中学生发现一个奇妙的“定理”,请角谷教授证明,而教授无能为力,于是产生角谷猜想。
猜想的内容是:
任给一个自然数,若为偶数除以2,若为奇数则乘3加1,得到一个新的自然数后按照上面的法则继续演算,若干次后得到的结果必然为1。
请编程验证。
本题是一个沿未获得一般证明的猜想,但屡试不爽,可以用程序验证。
题目中给出的处理过程很清楚,算法不需特殊设计,可按照题目的叙述直接进行证。
intn,count=0;
Pleaseenternumber:
scanf("
%d"
&
n);
/*输入任一整数*/
do{
if(n%2)
n=n*3+1;
/*若为奇数,n乘3加1*/
[%d]:
%d*3+1=%d\n"
++count,(n-1)/3,n);
else
n/=2;
/*若为偶数n除以2*/
%d/2=%d\n"
++count,2*n,n);
}while(n!
=1);
/*n不等于1则继续以上过程*/
11.常胜将军
现有21根火柴,两人轮流取,每人每次可以取走1至4根,不可多取,也不能不取,谁取最后一楰火柴谁输。
请编写一个程序进行人机对弈,要求人先取,计算机后取;
计算机一方为“常胜将军”。
在计算机后走的情况下,要想使计算机成为“常胜将军”,必须找出取关键。
根据本题的要求枷以总结出,后走一方取子的数量与对方刚才一步取子的数量之和等于,就可以保证最后一个子是留给先取子的那个人的。
据此分析进行算法设计就是很简单的工作,编程实现也十分容易。
inta=21,i;
Gamebegin:
\n"
while(a>
0)
Howmanystickdoyouwishtotake(1~%d)?
a>
4?
4:
a);
i);
}while(i>
4||i<
1||i>
/*接收正在确的输入*/
if(a-i>
0)printf("
%dstickleftinthepile.\n"
a-i);
if((a-i)<
Youhavetakenthelaststick.\n"
***Youlose!
\nGameOver.\n"
/*输出取胜标记*/
break;
Computetake%dstick.\n"
5-i);
/*输出计算机取的子数*/
a-=5;
a);
12.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 趣味 编程 整理 答案