您的位置:首页 > 理论基础

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

2017-02-05 15:50 501 查看
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 1000
void 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;
}
程序截图:




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: