c语言测试_经典c语言测试题
c语言测试由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“经典c语言测试题”。
第一章
数值处理
1.1 有一个老人在临死前把三个儿子叫到跟前,告诉他们把19头牛分了,老大分1/2,老二分1/4,老三分1/5,说完就死了.按当地习俗,不能宰牛.问三个儿子各能分多少?(19头牛.c)
(答案:10,5,4)
分析:由于19与2、4、5都不能整除,所以就不能用平常的方法来解决这个
问题。但是,如果仔细一点就可以发觉到:1/2+1/4+1/5=19/20,而牛的数量刚
好为19。由此,就不难得出该问题的解决办法:
1.2 一元钱分成1分、2分、5分的,问有多少种分法?(分钱.c)(答案:541种.)#include void main(){int i,j,k,b=0;for(i=0;i void main()
(答案10,16)1.4 在爱尔兰守神节那天,举行每年一度的庆祝游戏,指挥者若将乐队排成10人、9人、8人、7人、6人、5人、4人、3人和2人时,最后的一排总是缺少一个人,那些人想这个位置大概是给数月前死去的乐队成员凯西还留着位置。指挥者见到总缺一人恼火了,叫大家排成一列纵队前进。假定人数不超过7000人,那么乐队究竟有多少人?(乐队人数.c)
(答案:2519人。)
}
#include void main(){int i;for(i=1;i
printf(“%dn”,i);}
1.5 战士们做了一个靶子,靶子分五格,中心是39环,从左起顺时针是23、17、24、16。
战士小李射了若干枪,每一次都击中靶子,并且正好是100环。问他打了几枪?每枪
多小环?(靶子趣谈.c)
(答案:6枪,环数为17,17,17,17,16,16。)#include void main(){int i,j,k,h,g;for(i=0;i
printf(“%d个23 %d个17 %d个24 %d个16 %d个39n”,i,j,k,h,g);} 1.6 甲、乙两个城市有一条999公里长的公路。公路旁每隔一公里竖立着一个里程碑,里程碑的半边写着距甲城的距离,另半边写着距乙城的距离。有位司机注意到有的里程碑上所写的数仅用了两个不同的数字,例如000/999仅用了0和9,118/881仅用了1和8。算一算具有这种特征的里程碑共有多少个,是什么样的?
(答案:40个)分析:从题意中可知每对数仅用了两个不同的数字,并且两个数字之和衡等于9.并且,每对数之和也应衡等于999.解法一: 该解法利用三重循环分别求出每个数字的各位数.因为每个数最多只用两个不同的数字,所以每个数中至少有2个数字是相同的.再根据两个不同数字之和衡等于9,不难得出如下求解过程:(里程碑1.c)
解法二:仔细分析题意,可得出如下结论:假设两个数字分别为a与b,则b=9-a;由排列组合原理可知,由a和b所能组成的三位数对如下:
aaa/bbb;aab/bba;aba/bab;abb/baa;
bbb/aaa;bba/aab;bab/aba;baa/abb.其中,每一对数之和衡等于999(如:aab+bba=999),并且后四对数为前面四对数中每两个数的简单对调(如:aab/bba→bba/aab).由此,便可得出如下求解过程 #include void main(){int i,j,k,n=0;for(i=0;i
if((i==j&&i==k&&j==k)||(i==j&&i+k==9)||(i==k&&i+j==9)||(j==k&&i+j==9)){n++;printf(“%3dn”,i*100+j*10+k);} printf(“%3dn”,n);} 1.7 一个四位数,其千位、百位、十位数字依次组成等差数列,百位上的数字是个位、千位数字的等比中项,把该四位数的数字反序所得数与原数的和为11110。求原四位数。(位等差.c)
(答案:2468或5555。)
分析:设该四位数为abcd,则由“其千位、百位、十位数字依次组成等差数列”可得(其中x为等差系数):
b=a+x
(1)
c=a+2*x
(2)再由“百位上的数字是个位、千位数字的等比中项”可得: a*d=b*b
(3)由(1)、(3)可得: a*d=(a+x)*(a+x)(4 #include void main(){int f1,f2,f3,f4,i;for(i=1000;i
1.8 一位学生说“我的岁数的三次方是个四位数,四次方是个六位数。要组成我岁数的三次方和四次方,需要用遍0~9十个数字。”请问他多少岁?
解法一: 该解法先分解出岁数的三次方和四次方的每一位,然后再判断这些数字是
否重复.(岁数1.c)#include void main(){long a[10]={0},s[10]={0},i,n3,x=18,n4;do { n3=x*x*x;for(i=3;i>=0;i--){ } n4=x*x*x*x;for(i=9;i>=4;i--){a[i]=n4%10;n4/=10;} for(i=0;i
解法二:该解法与解法一比起来在判断数字是否重复方面有其独特之处,其在判断函数中用一数组a[10]来分别表示是否出现该数组下标所对应的数字,例如:若a[0]=1表示零的个数为零,若a[0]=0,表示此前已出现过数字0。
1.9 某女士手里拎了一篮鸡蛋,从她身边奔跑而过一匹惊马,吓了她一跳,结果把篮里的鸡蛋,她说两个一数,三个一数,四个一数,五个一数时,余数分别为1,2,3和4。问篮里原有多少个鸡蛋?(打碎的鸡蛋.c)
(答案:59个。)a[i]=n3%10;
n3/=10;
分析:解决这类问题的要点就是找到一个最大的数作为步长,以减少其循环次数,该例题的最大数为5,故应以5为步长 #include void main(){int i;for(i=1;i
新年晚会老师给大家分糖,手端着一盘糖,让第一个同学先拿1块糖,再把盘中的糖分1/7给他;然后让第二个同学拿2块糖,再把盘中的糖的1/7给他;第三个同学拿3块糖后,仍把盘中的糖的1/7给他。照这个办法分下去,最后一个同学自己拿完糖后,糖恰好分完,而且每个人分到的糖块数相同。问共有几人?每人分几块糖?(分糖.C)#include void main(){int n,b;float sum1,sum2;for(n=8;;n++){sum1=(n+6)/7.0;sum2=(6*n+78)/49.0;if(sum1!=(int)sum1)continue;if(sum2!=(int)sum2)continue;if(sum1==sum2)break;} b=(int)(n/sum1);printf(“n学生数:%dn每个人糖数:%dn”,b,b);} 1.1
1运动会连续开了N天,一共发了M枚奖牌。第一天发了一玫再加上剩下的1/7,即第一天发了[1+(M-1)/7]枚;第二天发了两枚再加上剩下的1/7,以后每天按此规律发奖牌,最后一天,第N天,刚好发完剩下的N枚奖牌。问运动会开了几天?一共发了几枚奖牌?(奖牌.C)#include void main(){int M,N,b;float sum1,sum2;for(M=8;;M++){sum1=(M+6)/7.0;sum2=(6*M+78)/49.0;if(sum1!=(int)sum1)continue;if(sum2!=(int)sum2)continue;if(sum1==sum2)break;} b=(int)(M/sum1);printf(“n天数:%dn奖牌数:%dn”,b,M);}
1.1
2父亲临终时,让按下列方式分配他的遗产:大儿子分得100克朗和剩下财产的1/10,二儿子分得200克朗和剩下财产的1/10,三儿子分得300克朗和剩下财产的1/10。依此类推,最后发现这种分法好极了,因为所有儿子分得的钱数恰好相等。问他共有几个儿子?每个儿子分得多少遗产?(同等遗产.c)
(答案:9个儿子,每人900克朗)
注:该题的算法可参照“分糖”.#include void main(){int n,b;float sum1,sum2;for(n=11;;n++){sum1=(n+900)/10.0;sum2=(9*n+17100)/100.0;if(sum1!=(int)sum1)continue;if(sum2!=(int)sum2)continue;if(sum1==sum2)break;} b=(int)(n/sum1);printf(“n天数:%dn奖牌数:%dn”,b,n);}
1.13 两衣袋中装满了一角与二角五分的菜票,但还不到20元,左右两个衣袋中的钱
数相等。左口袋中每种菜票的数目相同,而右口袋中每种菜票的钱数相等,你
能算出两口袋中各菜票的数目吗?(菜票问题.c)
(答案:左:10*20+25*20=700;右:10*35+25*14=700)
分析:设左口袋中每种菜票的数量都为x;右口袋中每种菜票的钱数都为
y,一角菜票的张数为m,二角五分菜票的张数为n;则可得出如下方程:
10*x+25+x=2*y
(1)
10*m+25*n=2*y
(2)
10*m=25*n
(3)
由(3)式可得:
n=m*2/5
(4)
由(1)(2)(3)式可得:
x=m*20/35(5)
根据(4)、(5)两式可得如下求解过程: #include void main(){int n,m,y,x;for(m=1;m
}}
1.14 出售金鱼者决定将缸里的金鱼分五次全部卖出:第一次卖出全部金鱼的一半加
二分之一条金鱼;第二次卖出剩余金鱼的三分之一加三分之一条金鱼;第三次
卖出剩余金鱼的四分之一加四分之一条金鱼;第四次卖出剩余金鱼的五公之一
加五分之一条金鱼。现在还剩下11条金鱼,当然出售金鱼时不能切开或者有任
何破损的,问这鱼缸里原有多少条金鱼?(出售金鱼.c)
(答案:鱼缸里原有59条金鱼。)#include void main(){int ci,x1,x2;ci=5;x2=11;while(ci>1){x1=(x2+1.0/ci)*ci*1.0/(ci-1);x2=x1;ci--;} printf(“%dn”,x2);} y=10*x+25*x;if(x==m*20*1.0/35&&n==m*2*1.0/5&&(10*x+25*x)
1.15 有10箱苹果,编号从1#..10#,分别装有1,2,4,8,16,32,64,128,256和512个苹果。要取苹果若干(1000以内任意自然数),而不打开箱子,应该取哪几箱呢?(取苹果.C)
分析:由题意可知,箱的编号m与箱中苹果个数n存在如下对应关系:m等于2的n-1次幂.根据十进制数与二进制数之间互相转化的原理可得出如下求解过程: #include #include void main(){int i,j,k=0,a[10],b[10],m,n;scanf(“%d”,&n);for(m=0;m
1.16 山上有10个洞,呈顺时针排列,有一只狐狸从第10号洞开始按第n次跨越n个洞的规则追兔子,可是追了一天也没有抓到兔子,求兔子可能在哪几个洞中?(狐狸追兔.c)分析:根据题意,只需模拟狐狸跨越100次,就可得到狐狸未经过的洞.#include void main(){ int i,n,a[10];
for(i=0;i
a[i]=0;n=0;
for(i=1;i
{n=(n+i)%10;
a[n]=1;}
printf(“兔子可能躲的洞号为:”);
for(i=0;i
1.17 有M个人围成一圈,每人指定一个号码(1,2,3...),从第一个人数起,数
到N时这个人就从圈里出来,再继续数1,2,3...N,数到第N个又出来。凡
从圈里出来的人的位置就不再数,直到只剩一个人为止。请指出从圈里出
来的人的次序。如,输入: 10
则屏幕上输出: 8 2 7 3 10 9 1 6 5(报数.C)
分析:这类问题通常解法是利用循环链表的原理对数到N的结点进行删除(对于结点总数不太多的情况往往利用数组来实现).这里虽然也是利用数组来实现,但是,它不是通过删除结点,而是通过对选中的结点置0从而避免了对数组的频繁移动操作.其实现原理如下: 1.数组初始化.数组下标相当于每个人对应的号码,数组单元值非零即表示该人还在圈中.因为并没有删除空的结点,也即虽然人出圈了,但该位置还留着.2.对圈中的人实行M次筛选,筛选的过程如下:
(1)报数:圈中的人顺序从1到N报数;
(2)即报数为N的人退出圈外,该位置置空;并输出该位置;
(3)当前所报的数置1,出圈次数 j 加1;
(4)若出圈次数 j >=M 则回到(1),否则程序结束.对应的程序如下: #include int main(void){ int count, i, m, n, no;
int num[50];
int *p;
scanf(“%d%d”, &n, &m);
for(i = 0;i
num[i] = i + 1;p = num;count = 1;no = 1;while(no
{if(p == num + n1)
p = num;
else
p++;} p = num;while(*p == 0)
p++;
printf(“ %dn”, *p);return 0;}
1.18
若干求婚者排成一行,一二报数,报单数的退场。余下的人靠拢后再一二报数,报单数的退场,最后剩下的一位就可以娶公主为妻。若现在你站出来数一下,共有101人在你前面,你应站到哪一个位置才能娶到公主呢?(娶公主.c)
(答案:第64个位置。)#include #include void main(){int i,j,k=0,a[101],b[7],h;for(i=1;i
分析:对该问题首先可用枚举法列出前几年的结果:
第一年:
1
第二年:
1
第三年:
1
第四年:
2
第五年:
3
第六年:
4
第七年:
6
第八年:
9
第九年:
13
第十年:
19
......从以上数据可以看出:从第四年开始,每年的数据都是前一年的数据
与前三年的数据之和。这样,就不难得出问题的解决方案。(递增牛群1.c)
解法一: 该解法利用f3,f2,f1,f这几个变量来保存前一、二、三年以及本年的牛的数量。
#include void main(){int f1,f2,f3,f,i=4,N;f1=1;f2=1;f3=1;scanf(“%d”,&N);do {f=f1+f3;f1=f2;f2=f3;f3=f;i++;} while(i
解法二: 该解法利用一个数组来实现循环队列的功能。其中变量i相当于队
列指针,把它与队列结点取模之后,随着i值的递增就能实现循环地遍历数组的 功能。(递增牛群2.c)1.20 某人学艺,两年满师,满师后,每年招一徒,其徒满师后亦如此招徒.问:此人自从师即日起至第15年其徒子徒孙共有多少人?(徒子徒孙.c)
注:该题的算法可参照“递增牛群”.#include void main(){int f1,f2,f,i=3;f1=1;f2=1;do {f=f1+f2;f1=f2;f2=f;i++;} while(i