首页 > 学院 > 开发设计 > 正文

蓝桥杯——计算机研究生机试真题(2017.2.16)

2019-11-08 19:27:27
字体:
来源:转载
供稿:网友
1. (2011年北京大学计算机研究生机试真题)鸡兔同笼题目描述:一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物。输入:第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,每行一个正整数a (a < 32768)输出:输出包含n行,每行对应一个输入,包含两个正整数,第一个是最少的动物数,第二个是最多的动物数,两个正整数用一个空格分开如果没有满足要求的答案,则输出两个0。样例输入:2320样例输出:0 0

5 10

源代码:

法一:可将问题情境转化为输入一个整数n,若n为奇数,输出“0 0”;否则若n是4的倍数,输出n/4 n/2的值,否则输出n/4+1 n/2的值(最小值即兔子数量最多鸡最少 最大值即鸡数量最多兔子数量最少的情况)

#include <stdio.h>int main(){	int a,n;	int t=0,sum;	scanf("%d",&n);	while(t<n)	{		scanf("%d",&a);		if(a%2!=0)			PRintf("0 0/n");		else if(a%4==0)			printf("%d %d/n",a/4,a/2);		else			printf("%d %d/n",a/4+1,a/2);		t++;	}    return 0;}法二:枚举所有可能情况,将鸡兔总数存入数组,然后取最值,但是时间代价大(注意最大值<=a/2的条件,故为了提高效率,可将主函数中的双重循环处设为<=a/2,否则会超时)

#include <stdio.h>#define maxn 50000void Find(int num[],int n){	int i;	int max,min;	max=min=num[0];	for(i=1;i<n;i++)	{		if(num[i]>max)			max=num[i];		if(num[i]<min)			min=num[i];	}	printf("%d %d/n",min,max);}int main(){	int a,n;	int i,j,t=0,count;	int num[maxn];	scanf("%d",&n);	while(t<n)	{		scanf("%d",&a);		count=0;		for(i=0;i<=a/2;i++)		{			for(j=0;j<=a/2;j++)			{				if(2*i+4*j==a)					num[count++]=i+j;			}		}		if(count==0)			printf("0 0/n");		else			Find(num,count);		t++;	}	return 0;}程序截图:

2. (2003-2005年华中科技大学计算机研究生机试真题)打印日期题目描述:给出年分m和一年中的第n天,算出第n天是几月几号。输入:输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。输出:可能有多组测试数据,对于每组数据,按 yyyy-mm-dd的格式将输入中对应的日期打印出来。样例输入:2000 32000 312000 402000 602000 612001 60样例输出:2000-01-032000-01-312000-02-092000-02-292000-03-012001-03-01

源代码:

#include <stdio.h>void Find(int a[],int y,int n,int t)            //第n天"查找" {	int i,j;	int m,d,sum=0;	for(i=1;i<t;i++)	{		if(n<=a[i])		{			j=i;			break;		}	}	m=j;	d=n-a[m-1];	printf("%04d-%02d-%02d/n",y,m,d);}int main(){	int y,n;	int sum1[13]={0,31,59,90,120,151,181,212,243,273,304,334,365};   //两个数组分别记录平年/闰年从1.1到第m个月月底的总天数 	int sum2[13]={0,31,60,91,121,152,182,213,244,274,305,335,366};	int sum,m,d;	while(scanf("%d %d",&y,&n)!=EOF)	{		if( (y%4==0 && y%100!=0) || (y%400==0) )			Find(sum2,y,n,13);		else			Find(sum1,y,n,13);	}	return 0;}程序截图:

3. (2008年北京大学方正实验室计算机研究生机试真题)简单密码题目描述:Julius Caesar曾经使用过一种很简单的密码。对于明文中的每个字符,将它用它字母表中后5位对应的字符来代替,这样就得到了密文。比如字符A用F来代替。如下是密文和明文中字符的对应关系。密文A B C D E F G H I J K L M N O P Q R S T U V W X Y Z明文V W X Y Z A B C D E F G H I J K L M N O P Q R S T U 你的任务是对给定的密文进行解密得到明文。你需要注意的是,密文中出现的字母都是大写字母。密文中也包括非字母的字符,对这些字符不用进行解码。输入:输入中的测试数据不超过100组。每组数据都有如下的形式,而且各组测试数据之间没有空白的行。一组测试数据包括三部分:1.    起始行 - 一行,包括字符串 "START" 2.    密文 - 一行,给出密文,密文不为空,而且其中的字符数不超过2003.    结束行 - 一行,包括字符串 "END" 在最后一组测试数据之后有一行,包括字符串 "ENDOFINPUT"。输出:对每组数据,都有一行输出,给出密文对应的明文。样例输入:STARTNS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJXENDSTARTN BTZQI WFYMJW GJ KNWXY NS F QNYYQJ NGJWNFS ANQQFLJ YMFS XJHTSI NS WTRJENDSTARTIFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJENDENDOFINPUT样例输出:IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSESI WOULD RATHER BE FIRST IN A LITTLE IBERIAN VILLAGE THAN SECOND IN ROMEDANGER KNOWS FULL WELL THAT CAESAR IS MORE DANGEROUS THAN HE

源代码:

#include <stdio.h>#include <string.h>#define maxlen 210#define flag 15void Fun(char str[],int n){	int i;	for(i=0;i<n;i++)	{		if(str[i]>='A' && str[i]<='E')			str[i]+=21;		else if(str[i]>='F' && str[i]<='Z')   //注意else,写成if会将处理后的A~E继续处理 			str[i]-=5;	}}int main(){	char start[flag],end[flag];	char str[maxlen];	int i,len;	while(gets(start)!=NULL)	{		if(strcmp(start,"ENDOFINPUT")==0)     //所有输入结束标志 			break;		if(strcmp(start,"START")==0)          //输入开始标志,处理字符串 		{			gets(str);			len=strlen(str);			Fun(str,len);		}		gets(end);		if(strcmp(end,"END")==0)              //输入结束标志,将处理后的字符串整串输出 			puts(str);	}	return 0;}程序截图:

※4. (2006年上海交通大学计算机研究生机试真题)2的幂次方题目描述:    Every positive number can be presented by the exponential form.For example, 137 = 2^7 + 2^3 + 2^0。    Let's present a^b by the form a(b).Then 137 is presented by 2(7)+2(3)+2(0). Since 7 = 2^2 + 2 + 2^0 and 3 = 2 + 2^0 , 137 is finally presented by 2(2(2)+2 +2(0))+2(2+2(0))+2(0).     Given a positive number n,your task is to present n with the exponential form which only contains the digits 0 and 2.输入:    For each case, the input file contains a positive integer n (n<=20000).输出:    For each case, you should output the exponential form of n an a single line.Note that,there should not be any additional white spaces in the line.样例输入:1315样例输出:2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

源代码:

#include <stdio.h>#include <math.h>void solve(int n)  {    int cnt=0;      while(pow(2,cnt)<=n)          cnt++;    cnt--;    if(cnt==0)        printf("2(0)");    else if(cnt==1)        printf("2");      else      {          printf("2(");          solve(cnt);          printf(")");      }      int num_r=n-pow(2,cnt);      if(num_r)      {          printf("+");          solve(num_r);      }  }  int main()  {      int n;      while(scanf("%d",&n)!=EOF)      {          solve(n);          printf("/n");      }      return 0;  }程序截图:


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表