趣味编程题整理及答案.docx
- 文档编号:7463186
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:13
- 大小:20.11KB
趣味编程题整理及答案.docx
《趣味编程题整理及答案.docx》由会员分享,可在线阅读,更多相关《趣味编程题整理及答案.docx(13页珍藏版)》请在冰豆网上搜索。
趣味编程题整理及答案
1.抓交通肇事犯
一辆卡车违反交通规则,撞人后逃跑。
现场有三人目击事件,但都没有记住车号,只记下车号的一些特征
。
甲说:
牌照的前两位数字是相同的;乙说:
牌照的后两位数字是相同的,但与前两位不同;丙是数学家,他说:
四位的车号刚好是一个整数的平方。
请根据以上线索求出车号。
*问题分析与算法设计
按照题目的要求造出一个前两位数相同、后两位数相同且相互间又不同的整数,然后判断该整数是否是另一个整数的平方。
*程序说明与注释
#include<>
#include<>
intmain()
{
inti,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*c if(c*c==k)printf("Lorry–No.is%d.\n",k);/*若是,打印结果*/ } } *运行结果 Lorry7744 2.百钱百鸡问题 中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”: 鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何? *问题分析与算法设计 设鸡翁、鸡母、鸡雏的个数分别为x,y,z,题意给定共100钱要买百鸡,若全买公鸡最多买20只,显然x的 值在0~20之间;同理,y的取值范围在0~33之间,可得到下面的不定方程: 5x+3y+z/3=100 x+y+z=100 所以此问题可归结为求这个不定方程的整数解。 由程序设计实现不定方程的求解与手工计算不同。 在分析确定方程中未知数变化范围的前提下,可通过对 未知数可变范围的穷举,验证方程在什么情况下成立,从而得到相应的解。 *程序说明与注释 #include<> intmain() { 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值的合理性及得到一组解的合理性*/ printf("%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。 *程序说明与注释 #include<> intmain() { inti,j,count=0; printf("REDBALLWHITEBALLBLACKBALL\n"); 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("%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 *程序说明与注释 #include<> intmain() { intx,y,z,count=0; printf("MenWomenChildren\n"); printf("........................................\n"); 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("%2d: %d%d%d\n",++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结婚 x! =3X的未婚夫不是C z! =3C不与Z结婚 题意还隐含着X、Y、Z三个新娘不能结为配偶,则有: x! =y且x! =z且y! =z 穷举以上所有可能的情况,代入上述表达式中进行推理运算,若假设的情况使上述表达式的结果均为真,则假设情况就是正确的结果。 *程序说明与注释 #include<> intmain() { intx,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("Xwillmarryto%c.\n",'A'+x-1);/*打印判断结果*/ printf("Ywillmarryto%c.\n",'A'+y-1); printf("Zwillmarryto%c.\n",'A'+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随便)。 上述各表达式之间的关系为“与”关系。 穷举每个人去或不去的各种可能情况,代入上述表达式中进行推理运算,使上述表达式均为“真”的情况就是正确的结果。 *程序说明与注释 #include<> intmain() { inta,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("Awill%sbeassigned.\n",a? "": "not"); printf("Bwill%sbeassigned.\n",b? "": "not"); printf("Cwill%sbeassigned.\n",c? "": "not"); printf("Dwill%sbeassigned.\n",d? "": "not"); printf("Ewill%sbeassigned.\n",e? "": "not"); printf("Fwill%sbeassigned.\n",f? "": "not"); } } *运行结果 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&&a+b! =0) 穷举每个人说真话或说假话的各种可能情况,代入上述表达式中进行推理运算,使上述表达式均为“真”的情况就是正确的结果。 *程序说明与注释 #include<> intmain() { inta,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("Zhangsantolda%s.\n",a? "truth": "lie"); printf("Lisitolda%s.\n",b? "truch": "lie"); printf("Wangwutolda%s.\n",c? "truch": "lie"); } } *运行结果 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说: 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<> intmain() { inta,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("Aispastedapieceof%spaperonhisforehead.\n", a? "white": "black"); printf("Bispastedapieceof%spaperonhisforehead.\n", b? "white": "black"); printf("Cispastedapieceof%spaperonhisforehead.\n", c? "white": "black"); printf("Dispastedapieceof%spaperonhisforehead.\n", d? "white": "black"); printf("Eispastedapieceof%spaperonhisforehead.\n", e? "white": "black"); } } *运行结果 Aispastedapaperofblackpaperonhisforehead.(黑) Bispastedapaperofblackpaperonhisforehead.(黑) Cispastedapaperofwhitepaperonhisforehead.(白) Dispastedapaperofblackpaperonhisforehead.(黑) Eispastedapaperofwhitepaperonhisforehead.(白) 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<> intmain() { inta,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("Aisa%s.\n",a? "honest": "lier");/*输出判断结果*/ printf("Bisa%s.\n",b? "honest": "lier"); printf("Cisa%s.\n",c? "honest": "lier"); } } *运行结果 Aisalier(说谎族) Bisalier(说谎族) Cisalier(说谎族) 10.角谷猜想 日本一位中学生发现一个奇妙的“定理”,请角谷教授证明,而教授无能为力,于是产生角谷猜想。 猜想的内容是: 任给一个自然数,若为偶数除以2,若为奇数则乘3加1,得到一个新的自然数后按照上面的法则继续演算,若干次后得到的结果必然为1。 请编程验证。 *问题分析与算法设计 本题是一个沿未获得一般证明的猜想,但屡试不爽,可以用程序验证。 题目中给出的处理过程很清楚,算法不需特殊设计,可按照题目的叙述直接进行证。 *程序说明与注释 #include<> intmain() { intn,count=0; printf("Pleaseenternumber: "); scanf("%d",&n);/*输入任一整数*/ do{ if(n%2) { n=n*3+1;/*若为奇数,n乘3加1*/ printf("[%d]: %d*3+1=%d\n",++count,(n-1)/3,n); } else { n/=2;/*若为偶数n除以2*/ printf("[%d]: %d/2=%d\n",++count,2*n,n); } }while(n! =1);/*n不等于1则继续以上过程*/ } 11.常胜将军 现有21根火柴,两人轮流取,每人每次可以取走1至4根,不可多取,也不能不取,谁取最后一楰火柴谁输。 请编写一个程序进行人机对弈,要求人先取,计算机后取;计算机一方为“常胜将军”。 *问题分析与算法设计 在计算机后走的情况下,要想使计算机成为“常胜将军”,必须找出取关键。 根据本题的要求枷以总结出,后走一方取子的数量与对方刚才一步取子的数量之和等于,就可以保证最后一个子是留给先取子的那个人的。 据此分析进行算法设计就是很简单的工作,编程实现也十分容易。 *程序说明与注释 #include<> intmain() { inta=21,i; printf("Gamebegin: \n"); while(a>0) { do{ printf("Howmanystickdoyouwishtotake(1~%d)? ",a>4? 4: a); scanf("%d",&i); }while(i>4||i<1||i>a);/*接收正在确的输入*/ if(a-i>0)printf("%dstickleftinthepile.\n",a-i); if((a-i)<=0) { printf("Youhavetakenthelaststick.\n"); printf("***Youlose! \nGameOver.\n");/*输出取胜标记*/ break; } else printf("Computetake%dstick.\n",5-i);/*输出计算机取的子数*/ a-=5; printf("%dstickleftinthepile.\n",a); } } 12.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 趣味 编程 整理 答案