趣味C语言题.docx
《趣味C语言题.docx》由会员分享,可在线阅读,更多相关《趣味C语言题.docx(18页珍藏版)》请在冰豆网上搜索。
![趣味C语言题.docx](https://file1.bdocx.com/fileroot1/2023-2/25/8ef9a816-c6bc-4d76-988b-359720cce229/8ef9a816-c6bc-4d76-988b-359720cce2291.gif)
趣味C语言题
韩信点兵
在中国数学史上,广泛流传着一个“韩信点兵”的故事:
韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。
据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:
按从1至5报数,记下最末一个士兵报的数为1;
再按从1至6报数,记下最末一个士兵报的数为5;
再按从1至7报数,记下最末一个士兵报的数为4;
最后按从1至11报数,最末一个士兵报的数为10;
你知道韩信至少有多少兵?
()z谁结婚呢?
魔术师的秘密
在一次晚会上,一位魔术师掏出一叠扑克牌,取出其中13张黑桃,预先洗好后,把牌面
朝下,对观众说:
“我不看牌,只数一数就能知道每张牌是什么?
”魔术师口中念一,
将第一张牌翻过来看正好是A;魔术师将黑桃A放到桌上,继续数手里的余牌,第二次数
1,2,将第一张牌放到这叠牌的下面,将第二张牌翻开,正好是黑桃2,也把它放在桌
子上。
第三次数1,2,3,前面二张牌放到这叠牌的下面,取出第三张牌,正好是黑桃3,
这样依次将13张牌翻出,准确无误。
现在的问题是,魔术师手中牌的原始顺序是怎样的?
约瑟夫问题
这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:
15个教徒和15个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:
30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止.问怎样排法,才能使每次投入大海的都是非教徒.
求车速
一辆以固定速度行驶的汽车,司机在上午10点看到里程表上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的),为95859.两小时后里程表上出现了第二个新的对称数.问该车的速度是多少新的对称数是多少?
常胜将军
现有21根火柴,两人轮流取,每人每次可以取走1至4根,不可多取,也不能不取,谁取最后一根火柴谁输.请编写一个程序进行人机对弈,要求人先取,计算机后取;计算机一方为"常胜将军".
十进制转换成N进制(N=2816)
定义一个方法Trans(intnum,intregx)实现将一个输入十进制数num转换成regx进制
Eg:
Trans(100,16)表示将100转成16进制数输出
求100到1000之间有多少个其数字之和为5的整数.
(答案:
104,113,122,131,140,203,212,221,230,302,311,320,401,410,500)
打鱼还是晒网scanf(“%d%d%d”,&year,&month,&day);
中国有句俗语叫"三天打鱼两天晒网".某人从1990年1月1日起开始"三天打鱼两天晒网",问这个人在以后的某一天中是"打鱼"还是"晒网".
*思考题:
请打印出任意年份的日历
*运行结果
Enteryear/month/day:
19911025
Hewasfishingatday.
Enteryear/month/day:
19921025
Hewassleepingatday.
Enteryear/month/day:
19931025
Hewassleepingatday.
求具有abcd=(ab+cd)^2性质的四位数
3025这个数具有一种独特的性质:
将它平分为二段,即30和25,使之相加后求平方,即(30+25)2,恰好等于3025本身.请求出具有这样性质的全部四位数.
*运行结果
Therearefollowingnumberswith4digitssatisfiedcondition:
202530259801
填数字游戏
已知下面的算式:
ABCD
×E
DCBA计算ABCDE取什么值?
Sum
谁在说谎
张三说李四在说谎,李四说王五在说谎,王五说张三和李四都在说谎.现在问:
这三人中到底谁说的是真话,谁说的是假话
*运行结果
Zhangsantoldalie(张三说假话)
Lisitoldatruch.(李四说真话)
Wangwutoldalie.(王五说假话)
谁是窃贼
公安人员审问四名窃贼嫌疑犯.已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎的.在回答公安人员的问题中:
甲说:
"乙没有偷,是丁偷的."
乙说:
"我没有偷,是丙偷的."
丙说:
"甲没有偷,是乙偷的."
丁说:
"我没有偷."
请根据这四人的答话判断谁是盗窃者.
*运行结果ThethiefisB.(乙为窃贼.)
求数字
求出所有可能的以下形式的算式,每个算式中有九个数位,正好用尽1到9这九个数字。
1)○○○+○○○=○○○ (共有168种可能的组合)
2)○×○○○○=○○○○ (共有2种可能的组合)
3)○○×○○○=○○○○ (共有7种可能的组合)
4)○×○○○=○○×○○○ (共有13种可能的组合)
5)○×○○○=○×○○○○ (共有28种可能的组合)
6)○○×○○=○×○○○○ (共有7种可能的组合)
7)○○×○○=○○×○○○ (共有11种可能的组合)
爱因斯坦的数学题
爱因斯坦出了一道这样的数学题:
有一条长阶梯,若每步跨2阶,则最最后剩一阶,若每步跨3阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶则最后剩5阶.只有每次跨7阶,最后才正好一阶不剩.请问这条阶梯共有多少阶?
119
角谷猜想
猜想的内容是:
任给一个自然数,若为偶数除以2,若为奇数则乘3加1,得到一个新的自然数后按照上面的法则继续演算,若干次后得到的结果必然为1.请编程验证.
黑洞数495与6174
黑洞数也称为陷阱数,又称“Kaprekar问题”,是一类具有奇特转换特性的数。
任何一个数字不全相同的三位数,经有限次“重排求差”操作,总会得到495.最后所得的495即为三位黑洞数。
所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。
(6174为四位黑洞数)
例如,对三位数207:
第1次重排求差得:
720-027=693;
第2次重排求差得:
963-369=594;
第3次重排求差得:
954-459=495;
以后会停留在495这一黑洞数。
如果三位数的3个数字全同,一次转换后即为0.因而,可把0与495一并作为判断条件。
试求出任意输入三位数重排求差的过程。
梅森尼数
形如2n-1的素数称为梅森尼数(MersennePrime)。
例如22-1=3、23-1=7都是梅森尼数。
1722年,双目失明的瑞士数学大师欧拉证明了231-1=2147483647是一个素数,堪称当时世界上“以知最大素数”的一个记录。
试求出指数n<20的所有梅森尼数。
(答案共7个)
10个小孩分糖果
十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个小孩20块.然后所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块.问经过这样几次后大家手中的糖的块数一样多每人各有多少块糖?
*运行结果
child
r12345678910
01028221641061420
11565151910781017
21711611181598914
31615991517139912
414161310131716121011
513151512121617141111
613151614121417161312
713151615131316171513
814151616151415171715
915151616161515171817
1017161616161616171818
1118171616161616171818
1218181716161616171818
1318181817161616171818
1418181818171616171818
1518181818181716171818
1618181818181817171818
1718181818181818181818
委派任务
某侦察队接到一项紧急任务,要求在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也不去.
问应当让哪几个人去
*运行结果
Awillbeassigned.(去)
Bwillbeassigned.(去)
Cwillbeassigned.(去)
Dwillnotbeassigned.(不去)
Ewillnotbeassigned.(不去)
Fwillbeassigned.(去)
哪个大夫哪天值班
医院有A,B,C,D,E,F,G七位大夫,在一星期内(星期一至星期天)每人要轮流值班一天.现在已知:
A大夫比C大夫晚一天值班;
D大夫比E大夫晚二天值班;
B大夫比G大夫早三天值班;
F大夫的值班日在B和C大夫的中间,且是星期四;
请确定每天究竟是哪位大夫值班
*运行结果
DoctorEisondutyMONDAY.(星期一:
E)
DoctorBisondutyTUESDAY.(星期二:
B)
DoctorDisondutyWEDNESDAY.(星期三:
D)
DoctorFisondutyTHUESDAY.(星期四:
F)
DoctorGisondutyFRIDAY.(星期五:
G)
DoctorCisondutySATURDAY.(星期六:
C)
DoctorAisondutySUNDAY.(星期日:
A)
谁家孩子跑最慢
张王李三家各有三个小孩.一天,三家的九个孩子在一起比赛短跑,规定不分年龄大小,跑第一得9分,跑第2得8分,依此类推.比赛结果各家的总分相同,且这些孩子没有同时到达终点的,也没有一家的两个或三个孩子获得相连的名次.已知获第一名的是李家的孩子,获得第二的是王家的孩子.问获得最后一名的是谁家的孩子
*运行结果
753
861
942
Thelast王.
1~9分成1:
2:
3的三个3位数
将1到9这九个数字分成三个3位数,求第一个3位数,正好是第二个3位数的二倍,是第三个3位数的三倍.问应当怎样分法.
*运行结果
No.1:
192384576
No.2:
219438657
No.3:
273546819
No.4:
327654981
分油趣题
从大容器往外倒一定体积的液体也是中外古代数学家喜爱研究的一类问题,如下面这
道厨师分油的趣题:
“有一位厨师要从盛12斤油的桶中倒出6斤油来,可是手边只有盛5
斤油和盛8斤油的两个桶,问如何操作才能将6斤取出来呢?
”
10升水5升6升容器->3升出来
拉丁方阵
构造NXN阶的拉丁方阵(2<=N<=9),使方阵中的每一行和每一列中数字1到N只出现一次.如N=4时:
1234
2341
3412
4123
作业:
1黑与白
有A,B,C,D,E五个人,每人额头上都贴了一张或黑或白的纸条。
五人对坐,每
人都可以看到其它人额头上纸条的颜色,但不知道自己额头上纸条的颜色,五人
相互观察后----
A说:
“我看见三个人额头上贴白纸条,一人贴黑纸条”
B说:
“我看见四人额头上都贴黑纸条。
“
C说:
“我看见三个人额头上贴黑纸条,一人贴白纸条。
”
D说:
“我看见四人头上都贴白纸条。
”
E什么也没有说。
已经知道额头贴黑纸条的人说的是假话,额头贴白纸条的人说的是真话。
问究竟
谁的额头贴白纸条,谁的额头贴黑纸条?
2要求输入一个数字N,然后打印一个数字绕的圈。
例如:
N=3,然后输出:
1 2 3
8 9 4
7 6 5
N=4
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
依次例推。
。
。
要求用数组和循环实现。
黑与白
有A,B,C,D,E五个人,每人额头上都贴了一张或黑或白的纸条。
五人对坐,每
人都可以看到其它人额头上纸条的颜色,但不知道自己额头上纸条的颜色,五人
相互观察后----
A说:
“我看见三个人额头上贴白纸条,一人贴黑纸条”
B说:
“我看见四人额头上都贴黑纸条。
“
C说:
“我看见三个人额头上贴黑纸条,一人贴白纸条。
”
D说:
“我看见四人头上都贴白纸条。
”
E什么也没有说。
已经知道额头贴黑纸条的人说的是假话,额头贴白纸条的人说的是真话。
问究竟
谁的额头贴白纸条,谁的额头贴黑纸条?
我们用a,b,c,d,e表示每个人额头上所贴纸条的颜色,0代表黑色,1代表白色。
由于暂时无法判定究竟谁说的是真话,因此每个人的话都有对错二种可能。
以A说
的话为例:
假设A贴的是白纸条,寻么A说实话,有:
a&&b+c+d+e==3
假如A贴的是黑纸条,那么A说假话,有:
!
a&&b+c+d+e!
=3
因此根据A的回答,可以得到如下结论:
a&&b+c+d+e==3||!
a&&b+c+d+e!
=3
同样由b,c,d的回答,有如下结论:
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
与上例一样,让计算机穷举所有可能的情形,代入上述表达式进行推理运算,假如
满足上述表达式为真,说明找到了正确答案。
代码如下:
main()
{
int a,b,c,d,e;
for(a=0;a<=1;a++)
for(b=0;b<=1;b++)
for(c=0;c<=1;c++)
for(d=0;d<=1;d++)
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 is pasted %s.\n",a?
"white":
"black");
printf("B is pasted %s.\n",b?
"white":
"black");
printf("C is pasted %s.\n",c?
"white":
"black");
printf("D is pasted %s.\n",d?
"white":
"black");
printf("E is pasted %s.\n",e?
"white":
"black");
}
}
魔术师的秘密
在一次晚会上,一位魔术师掏出一叠扑克牌,取出其中13张黑桃,预先洗好后,把牌面
朝下,对观众说:
“我不看牌,只数一数就能知道每张牌是什么?
”魔术师口中念一,
将第一张牌翻过来看正好是A;魔术师将黑桃A放到桌上,继续数手里的余牌,第二次数
1,2,将第一张牌放到这叠牌的下面,将第二张牌翻开,正好是黑桃2,也把它放在桌
子上。
第三次数1,2,3,前面二张牌放到这叠牌的下面,取出第三张牌,正好是黑桃3,
这样依次将13张牌翻出,准确无误。
现在的问题是,魔术师手中牌的原始顺序是怎样的?
解决这类问题的要害在于利用倒推的方法推出原来牌的顺序。
假设桌上摆着13个空盒子,编 号为1至13,将黑桃A放入第一个盒子中,从下一个空盒
子开始对空盒子计数,当数到第二个空盒子时,将黑桃2放入空盒子中,然后再从下一个
空盒子开始对空盒子计数。
顺序放入3,4,5等,直到全部放入13张牌,注重在计数时要
跳过非空的盒子,只对空盒子计数,最后得到的牌在盒子中的顺序,就是魔术师手中原
来牌的顺序。
计算机就是模拟这种行之有效的倒推方法的。
代码如下:
#include
int a[14];
main()
{
int i,n,j=1;
printf("The orginal order of cards is:
\n");
for(i=1;i<=13;i++) /*i为空盒子的顺号*/
{ n=1;
do
{ if(j>13)j=1;
if(a[j])j++;
else
{ if(n==i)a[j]=i;
j++;
n++;
}while(n<=i);
}
for(i=1;i<=13;i++)
printf("%2d,",a[i]);
}
分油趣题
从大容器往外倒一定体积的液体也是中外古代数学家喜爱研究的一类问题,如下面这
道厨师分油的趣题:
“有一位厨师要从盛12斤油的桶中倒出6斤油来,可是手边只有盛5
斤油和盛8斤油的两个桶,问如何操作才能将6斤取出来呢?
”
我们首先用字母a,b,c代表12斤桶,8斤桶和5斤捅。
规定倒油的顺序为:
a->b->c->a
并且必须符合如下规则:
1.b(8斤桶)倒空后才能从a(12斤桶)中取油。
2.c(5斤桶)盛满后才能向a(12斤捅)中倒油。
我们设从a中往b倒油x次,从c往a倒油y次,那么最后a中剩下的油应该为12-
8x+6y斤,按照题意,我们得到如下方程,
12-8x+6y=6:
我们为了得到这个方程的解,应按照上述的倒油规则不断的倒下去,直到a中或b中
油的重量为6斤为止,另外也可以改变倒油的规则,看能否找到最好的倒油步聚。
代码:
#include
int i;
main()
{ int a,y,z;
printf("Input Full a ,Empty b,c,Get i:
"); /*读入3个容器的容量和最后需要的数量*/
scanf("%d%d%d",&a,&y,&z,&i);
getti(a,y,z);
}
getti(int a,int y,int z)
{ int b=0,c=0; /*b,c为二个容器的实际重量*/
printf("a%d b%d c%d\n%4d%4d%4d\n",a,y,z,a,b,c);
while(a!
=i||b!
=i) /*假如满足要求退出循环*/
{ if(!
b) /*假如b为空,从a往b倒油*/
{ a-=y;b=y;
}
else if(c==z)
{ a+=z;c=0 /*假如c已满,从c往a倒油*/
}
else if(b>z-c)
{ b-=(z-c);c=z; /*假如b的重量大于c的剩余重量,倒满c*/
}
else
{ c+=b;b=0; /*否则将b中的油全部倒入c*/
}
printf("%4d%4d%4d\n",a,b,c);
}
}
要求输入一个数字N,然后打印一个数字绕的圈。
例如:
N=3,然后输出:
1 2 3
8 9 4
7 6 5
N=4
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
依次例推。
。
。
要求用数组和循环实现。
分析:
螺旋巨阵问题
楼主可以这样去考虑 找出这个数组的规律
思路:
第一:
输出第一行的所有列
第二:
输出每一行的最后一列
第三:
输出每一列的最后一行
第四:
输出第一列的所有行
四步做完之后再去考虑它的内向循环 依次减一就可以了
总的循环次数是行或列的一半
因为当 N 是奇数的时候才需要填充 (N/2)+1 次,N是偶数的时候只要填充 (N/2)次,
i是从0开始的,所以不需要等于i<=N/2。
int i,j,n=1,a[N][N];
// 每次顺时针填充一个“口”字型。
假设分为X轴Y轴坐标
for (i=0; i{
for (j=i; j{
a[i][j] = n++;
}
for (j=i+1; j{
a[j][N-i-1] = n++;
}
for (j=N-i-2; j>i; j--) // 往左填充,X保持,Y--
{
a[N-i-1][j] = n++;
}
for (j=N-i-1; j>i; j--) // 往上填充,Y保持,X--
{
a[j][i] = n++;
}
}
for (i=0; i {
printf("\n\n