您好,欢迎访问三七文档
当前位置:首页 > 幼儿/小学教育 > 小学教育 > 趣味编程题整理及答案
1.抓交通肇事犯一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。*问题分析与算法设计按照题目的要求造出一个前两位数相同、后两位数相同且相互间又不同的整数,然后判断该整数是否是另一个整数的平方。*程序说明与注释#includestdio.h#includemath.hintmain(){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*ck;c++);/*判断该数是否为另一整数的平方*/if(c*c==k)printf(Lorry–No.is%d.\n,k);/*若是,打印结果*/}}*运行结果Lorry_No.is77442.百钱百鸡问题中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?*问题分析与算法设计设鸡翁、鸡母、鸡雏的个数分别为x,y,z,题意给定共100钱要买百鸡,若全买公鸡最多买20只,显然x的值在0~20之间;同理,y的取值范围在0~33之间,可得到下面的不定方程:5x+3y+z/3=100x+y+z=100所以此问题可归结为求这个不定方程的整数解。由程序设计实现不定方程的求解与手工计算不同。在分析确定方程中未知数变化范围的前提下,可通过对未知数可变范围的穷举,验证方程在什么情况下成立,从而得到相应的解。*程序说明与注释#includestdio.hintmain(){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。*程序说明与注释#includestdio.hintmain(){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*程序说明与注释#includestdio.hintmain(){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的未婚夫不是Cz!=3C不与Z结婚题意还隐含着X、Y、Z三个新娘不能结为配偶,则有:x!=y且x!=z且y!=z穷举以上所有可能的情况,代入上述表达式中进行推理运算,若假设的情况使上述表达式的结果均为真,则假设情况就是正确的结果。*程序说明与注释#includestdio.hintmain(){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+b1A和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随便)。上述各表达式之间的关系为“与”关系。穷举每个人去或不去的各种可能情况,代入上述表达式中进行推理运算,使上述表达式均为“真”的情况就是正确的结果。*程序说明与注释#includestdio.hintmain(){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)穷举每个人说真话或说假话的各种可能情况,代入上述表达式中进行推理运算,使上述表达式均为“真”的情况就是正确的结果。*程序说明与注释#includestdio.hintmain(){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!=3B说:b&&a+c+d+e==0||!b&&a+c+d+e!=0C说:c&&a+b+d+e==1||!c&&a+b+d+e!=1D说:d&&a+b+c+e==4||!d&&a+b+c+e!=4穷举每个人额头所帖纸
本文标题:趣味编程题整理及答案
链接地址:https://www.777doc.com/doc-3894568 .html