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

蓝桥杯——2010 吉大计算机研究生机试真题(2017.2.5)

2019-11-14 09:09:00
字体:
来源:转载
供稿:网友

1. 三角形的边

源代码:

#include <stdio.h>void fun(int a,int b,int c){	int min,mid,max;	int t;	if(a>b)		t=a,a=b,b=t;	if(b>c)		t=b,b=c,c=t;	if(a>b)		t=a,a=b,b=t;	min=a,mid=b,max=c;	PRintf("%d/n",min+mid-max);}int main(){	int a,b,c;	while(scanf("%d %d %d",&a,&b,&c)!=EOF)	{		if(a==0)			break;		fun(a,b,c);	}	return 0;}程序截图:

2. 平方因子

源代码:

#include <stdio.h>int main(){	int i,n;	int flag;	while(scanf("%d",&n)!=EOF)	{		flag=0;		if(n==0)			break;		for(i=2;i<n;i++)		{			if(n%i==0 && (i*i)%n==0)			{				flag=1;				break;			}		}		if(flag==1)			printf("Yes/n");		else			printf("No/n");	}	return 0;}程序截图:

3. 排列与二进制

分析:正常的顺序应该先求出排列数,再将其转化成二进制数,之后进行末尾连续0的判断,但是要注意其中有几个难点:        ①求排列数的结果是否越界,越界之后用数组是否方便?        ②转换成二进制也需要存入数组中。        但是根据十进制转换成二进制的商除法就会发现,不断除以2,先出现的就是最后二进制从后往前的数(即除2取余)。故要求二进制末尾的连续0的个数,只要看n(n-1)(n-2)……(n-m+1)最多可以整除几个2即可(利用此方法可以避免可能的数组越界和int型超精度问题)

源代码:

#include <stdio.h>int main(){	int n,m;	int i,t,num;                          //num记录排列数后面0的个数 	while(scanf("%d %d",&n,&m)!=EOF)	{		num=0;		if(n==0)			break;		for(i=n-m+1;i<=n;i++)             // n*(n-1)*(n-2)*...*(n-m+1)		{			t=i;			while(t%2==0)                 //除2取余得0时,即为排列数后面的0 			{				num++;				t/=2;                     //除2 			}		}		printf("%d/n",num);	}	return 0;}程序截图:

4. 怪异的洗牌

源代码:

#include <stdio.h>#define maxn 1000void Shift(int poker[],int result[],int x,int n)       //移位(数组循环移位问题) {	int i,j=0;	for(i=x;i<n;i++)                                   //将数组第x+1个元素到最后一个元素移到最前面 		result[j++]=poker[i];	for(i=0;i<x;i++)                                   //其余元素置后 		result[j++]=poker[i];}void Flip(int result[],int half)                       //翻转(数组逆置/逆序输出问题) {	int i=0,j=half-1;                                  //以下用逆序存储完成 	int temp;	while(i<j)	{		temp=result[i];		result[i]=result[j];		result[j]=temp;		i++,j--;	}}int main(){	int i,n,k,x; 	int t,half;                                        //t-移位/翻转操作次数  half-翻转操作标记 	int poker[maxn],result[maxn]={0};                  //两数组分别记录操作前和操作后的牌 	while(scanf("%d %d",&n,&k)!=EOF)	{		if(n==0)			break;		t=0;		for(i=0;i<n;i++)                               //操作前扑克牌赋值 			poker[i]=i+1;		while(t<k)		{			scanf("%d",&x);			Shift(poker,result,x,n);                   //移位操作 结果存入result数组 			if(n%2==0)                                 //确定翻转操作位置 				half=n/2;			else				half=(n-1)/2;			Flip(result,half);                         //在上述result数组结果基础上翻转 			t++;			for(i=0;i<n;i++)              //将一轮操作结束后的结果赋给poker数组(之前因为忽略此步操作WA了,k>1时将会派上大用场:( )				poker[i]=result[i];		}		for(i=0;i<n;i++)                               //k次操作结束后的结果 			printf("%d ",result[i]);		printf("/n");	}	return 0;}程序截图:


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