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

这篇博客介绍了两道蓝桥杯计算机研究生机试的真题,包括字母加密和画X图形规律。第一题涉及字符串加密算法,将字母替换为其后继字母;第二题要求根据特定规则输出F(n)图形,以X为基础进行扩展。给出了样例输入和输出,并提示了处理字符串数目输入的注意事项。
摘要由CSDN通过智能技术生成
1. (2009年浙江大学计算机研究生机试真题)寻找大富翁
题目描述:
    浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁.
输入:
    输入包含多组测试用例.
    每个用例首先包含2个整数n(0<n<=100000)和m(0<m<=10),其中: n为镇上的人数,m为需要找出的大富翁数, 接下来一行输入镇上n个人的财富值.
    n和m同时为0时表示输入结束.
输出:
    请输出乌镇前m个大富翁的财产数,财产多的排前面,如果大富翁不足m个,则全部输出,每组输出占一行.
样例输入:
3 1
2 5 -1
5 3
1 2 3 4 5
0 0
样例输出:
5

5 4 3

【分析】可抽取模型:n个数从大到小排序后,输出前m个数

#include <stdio.h>
#include <algorithm>
#define maxn 100010
using namespace std;
int main()
{
	int i,a[maxn];
	int n,m;
	while(scanf("%d %d",&n,&m)!=EOF)
	{
		if(n==0 && m==0)
			break;
		for(i=0;i<n;i++)
			scanf("%d",&a[i]);
		if(n<=m)
		{
			for(i=0;i<n-1;i++)
				printf("%d ",a[i]);
			printf("%d\n",a[n-1]);
		}
		else
		{
			sort(a,a+n);
			if(m==1)
				printf("%d\n",a[n-1]);
			else
			{
				for(i=n-1;i>n-m;i--)
					printf("%d ",a[i]);
				printf("%d\n",a[n-m]);
			}
		}
	}
	return 0;
}
程序截图:


2. (2008年北京大学软件所计算机研究生机试真题)密码翻译
题目描述:
    在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别。我们给出一种最简的的加密方法,对给定的一个字符串,把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,则可得到一个简单的加密字符串。
输入:
        可能有多组测试数据。每组测试数据的第一行是字符串的数目n, (也要使用get(s)读取字符串,再用n=atoi(s)获得整数数值),其余n行每行一个字符串,用gets(s)方式读取这一行字符串.每个字符串长度小于80个字符。
输出:
    对于每组数据,输出每行字符串的加密字符串。
样例输入:
1
Hello! How are you!
样例输出:
Ifmmp! Ipx bsf zpv!

【分析】注意这里将字符串的数目n设置为字符串类型,即输入的n为一个字符串s,然后使用n=atoi(s)获取整数数值

源代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxlen 105
void Trans(char *str)
{
    int i;
    for(i=0;str[i];i++)
    {
        if((str[i]>='A'&&str[i]<'Z') || (str[i]>='a'&&str[i]<'z'))
            str[i]+=1;
        else if(str[i]=='Z')
        	str[i]='A';
        else if(str[i]=='z')
        	str[i]='a';
    }
}
int main()
{
    int i,j,n;
    char str[maxlen],nstr[maxlen];
    while(gets(nstr))
    {
        n=atoi(nstr);                    //获取整数数值 
        for(i=0;i<n;i++)
        {
            gets(str);
            Trans(str);                  //翻译 
            puts(str);
        }
    }
    return 0;
}
程序截图:


※3. XXX定律之画X

题目描述:
给你一个n,然后让你输出F(n)
规则是这样的,F(n)的输出结果是:
F(n-1)     F(n-1)
      F(n-1)
F(n-1)      F(n-1)
F(1)的输出结果是:X
那么根据规则F(2)的输出结果应该是:
X X
 X 
X X
输入:
题目有多组输入,每组输入一个n(n<=7)。
当输入零或负数的时候结束输入。
输出:
对每组输入输出相应的F(n),每组输出最后一行是‘#’。
样例输入:
1
2
3
-1
样例输出:
X
#
X X
 X 
X X
#
X X   X X
 X     X 
X X   X X
   X X   
    X    
   X X   
X X   X X
 X     X 
X X   X X
#

源代码(参考):

#include <stdio.h>  
#include <string.h>  
#include <math.h>  
#define N (int)(pow(3, 6))  
int p[N][N];                                //设置这个二维数组保存XXX图案
void set(int n, int x, int y)               //设置图案中的每个点保存' '还是'X',递归进行此过程 
{  
	if (n == 1)                             //输入的n=1,则图案中只有一个X,设a[0][0]=1并直接返回 
	{  
		p[x][y] = 1;  
		return;
	} 
	int s = pow(3, n-2);                    //n>=2时以n=2是的图案为一个单位,递归打印n更大的时候的情况 
	set(n-1, x, y);  
	set(n-1, x+s, y+s);  
	set(n-1, x+2*s, y);  
	set(n-1, x, y+2*s);  
	set(n-1, x+2*s, y+2*s);  
}  
void print(int n)                           //打印图案 
{  
	int size = pow(3, n-1);  
	for (int i=0; i<size; i++)  
	{  
		for (int j=0; j<size; j++)  
		{  
			if (p[i][j] == 0)  
				printf(" ");  
			else  
				printf("X");  
		}  
		printf("\n");  
	}  
	printf("#\n");  
}  
int main()  
{
	int n;  
	while (scanf("%d", &n) != EOF)  
	{  
		if (n <= 0)  
			break;  
		memset(p, 0, sizeof(p));  
		set(n, 0, 0);  
		print(n);  
	}  
	return 0;  
}
程序截图:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值