考研复试机试题(2009)

Problem A:请写一个程序,给出指定整数范围【a ,b】内所有的完数,一个数如果恰好等于除它本身外的所有因子之和,这个数就称为完数,例如6是完数,因为6=1+2+3。

输入说明:共一组数据,为两个正整数,分别表示a和b(1<a<b<10^5)。

输出说明:指定范围内的所有完数,每个数占一行。

输入样本

1
100

输出样本

6

28

解答:

/*
 * 描述: 机试题A解答
 * 作者: 张亚超
 * 博客: 牟尼的专栏 http://blog.csdn.net/u012027907
 * 日期: 2014/7/23
 */
#include "stdio.h"

int main(){

	int a,b;
	int sum = 0;

    scanf("%d%d",&a,&b);

	for(int num = a; num <= b; num++){
		sum = num;

		for(int i = 1; i < num/2+1; i++){  //处理每个数
			if(num % i == 0){ //能被i整除
				sum -= i;  //减去一个因子
			}
		}
		if(sum == 0){
			printf("%d\n",num); //输出完数
		}
	}

	return 0;
}

Problem B:请写一个程序,对于一个m行m列的(1<m<10)的方阵,求其每一行,每一列及主对角线元素之和,最后按照从大到小的顺序依次输出。

输入说明:共一组数据,输入的第一行为一个正整数,表示m,接下来的m行,每行m个整数表示方阵元素。

输出说明:从大到小排列的一行整数,每个整数后跟一个空格,最后换行。

输入样本:

4

15
8 -2
6

31
24 18 71

-3
-9
27 13

17
21 38 69

输出样本:

159
145 144 135
81 60
44 32 28
27

解答:

#include "stdio.h"

#define Max 25

void sort(int store[],int count){
	//冒泡排序
	for(int i = 0; i < count; i++)
		for(int j = i+1; j < count; j++){
			if(store[i] < store[j]){
				int temp = store[i];
				store[i] = store[j];
				store[j] = temp;
			}
		}
}

void print(int store[],int count){
	//打印输出
	for(int i = 0; i < count; i++)
		printf("%d ",store[i]);
	printf("\n");
}

int main(){

	int m;
	int st[10][10],res[Max];
	int count = 0;
	scanf("%d",&m);

	//统计每行的和
	for(int i = 0; i < m; i++){
		int sum = 0;
		for(int j = 0; j < m; j++){
			scanf("%d",&st[i][j]);
			sum += st[i][j];
		}
		res[count++] = sum;
	}
    //统计每列的和
	for(i = 0; i < m; i++){
		int sum = 0;
		for(int j = 0; j < m; j++){
			sum += st[j][i];
		}
		res[count++] = sum;
	}

	int sum1,sum2;
	sum1 = sum2 = 0;
	for(i = 0; i < m; i++){ //统计主副对角线的和
		sum1 += st[i][i];
		sum2 += st[i][m-i-1];
	}
	res[count++] = sum1;
	res[count++] = sum2;

	sort(res,count);
	print(res,count);

	return 0;
}

Problem C:对于给定的字符序列,从左至右将所有的数字字符取出拼接成一个无符号整数(字符序列长度小于100,拼接出的整数小于2^31,),计算并输出该整数的最大因子(如果是素数,则其最大因子为自身)

输入说明:有多组数据,输入数据的第一行为一个正整数,表示字符序列的数目,每组数据为一行字符序列。

输出说明:对每个字符序列,取出所得整数的最大因子,若字符序列中没有数字或者找出的整数为0,则输出0,每个整数占一行输出。

输入样本:

3

sdf0ejg3.f?9f

?4afd0s&amp;2d79*(g

abcde

输出样本:

13

857

0

#include "stdio.h"

#define Max 100

int maxPrimeFactor(int n)
{
    int i,ans=0;
    for(i=2;i*i<=n;i++)
    {
        while(n%i==0)
        {
            ans=i;
            n/=i;
        }
    }
    if(n>1)ans=n;
    return ans;
}
bool isDigit(char ch){
	//判断是否是数字
	if(ch >= '0' && ch <= '9')
		return true;
	else
		return false;
}

int main(){
	char str[Max][Max],tmp;
	int  res[Max];
	int n;
	scanf("%d",&n);

	for(int j = 0; j < n; j++){
		scanf("%s",str[j]);

		int sum = 0;
		int i = 0;
        res[j] = 0;
		while(str[j][i] != '\0'){
			tmp = str[j][i];
			if(isDigit(tmp)){
				sum = sum*10 + (tmp - '0');
			}
			i++;
		}
		res[j] = maxPrimeFactor(sum);
	}

	for(int i = 0; i < n; i++)
		printf("%d\n",res[i]);

	return 0;
}

Problem D: 已知某二叉树的先序序列和中序序列,编程计算并输出该二叉树的后序序列。

输入说明:仅一组数据,分为两行输入,第一行表示指定二叉树的先序序列,第二行表示该二叉树的中序序列,序列元素均为大写英文字符,表示二叉树的结点。

输出说明:在一行上输出该二叉树的后序序列。

输入样本:

ABDGCEFH

DGBAECHF

输出样本:

GDBEHFCA

#include <stdio.h>
#include <string.h>

struct Node{
	Node *lchild;
	Node *rchild;
	char c;
}Tree[50];
int loc;

Node *creat(){
	Tree[loc].lchild = Tree[loc].rchild = NULL;
	return &Tree[loc++];
}
char str1[30],str2[30];

void PostOrder(Node *T){
	if(T->lchild != NULL){
		PostOrder(T->lchild);
	}
	if(T->rchild != NULL){
		PostOrder(T->rchild);
	}
		printf("%c",T->c);
}

Node *build(int s1,int e1,int s2,int e2){
	Node *ret = creat();
	ret->c = str1[s1];
	int rootIdx;
	for(int i = s2; i <= e2; i++){
		if(str2[i] == str1[s1]){
			rootIdx = i;
			break;
		}
	}
	if(rootIdx != s2){
		ret->lchild = build(s1+1,s1+(rootIdx-s2),s2,rootIdx-1);
	}

	if(rootIdx != e2){
		ret->rchild = build(s1+(rootIdx-s2)+1,e1,rootIdx+1,e2);
	}
	return ret;
}

int main(){

	while(scanf("%s",str1) != EOF){
		scanf("%s",str2);
		loc = 0;
		int L1 = strlen(str1);
		int L2 = strlen(str2);
		Node *T = build(0,L1-1,0,L2-1);
		PostOrder(T);
		printf("\n");
	}
	return 0;
}

Problem E:请写一个程序,判断给定表达式中的括号是否匹配,表达式中的合法括号为”(“, “)”, “[", "]“, “{“, ”}”,这三个括号可以按照任意的次序嵌套使用。

输入说明:有多个表达式,输入数据的第一行是表达式的数目,每个表达式占一行。

输出说明:对每个表达式,若其中的括号是匹配的,则输出”yes”,否则输出”no”。

输入样本:

4

[(d+f)*{}]

[(2+3))

()}

[4(6]7)9

输出样本:

yes

no

no

no

#include <stdio.h>
#include <string.h>
#include <stack>
using namespace std;
#define N 100

int ans[N];
char buf[N][N];

int match(char exp[],int n){
	stack<char> s;
	int i = 0,tag = 1;

	while(i < n && tag == 1){
		if(exp[i] == '(' || exp[i] == '[' || exp[i] == '{'){
			s.push(exp[i]);
		}
		else if(exp[i] == ')'){
			if(s.empty()){
				tag = 0;
				break;
			}
			if(s.top() == '('){
				s.pop();
			}
			else
				tag = 0;
		}
		else if(exp[i] == ']'){
			if(s.empty()){
				tag = 0;
				break;
			}
			if(s.top() == '['){
				s.pop();
			}
			else
				tag = 0;
		}
		else if(exp[i] == '}'){
			if(s.empty()){
				tag = 0;
				break;
			}
			if(s.top() == '{'){
				s.pop();
			}
			else
				tag = 0;
		}
		i++;
	}
	if(s.empty() == false)
		tag = 0;

	return tag;
}
int main(){

	int n;
	while(scanf("%d",&n) != EOF){
		for(int i = 0; i < n; i++)
			scanf("%s",buf[i]);

	    int cnt = 0;
		for(i = 0; i < n; i++){

			int len = strlen(buf[i]);
			if(match(buf[i],len))
				ans[cnt++] = 1;
			else
				ans[cnt++] = 0;
		}

		for(i = 0; i < cnt; i++)
			if(ans[i])
				printf("yes\n");
			else
				printf("no\n");

	}
	return 0;
}

时间: 2024-08-29 13:18:30

考研复试机试题(2009)的相关文章

考研复试机试题(2010)

考研复试机试题(2010) 转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907 解答: /* * 描述: 机试题A解答 * 作者: 张亚超 * 博客: 牟尼的专栏 http://blog.csdn.net/u012027907 * 日期: 2014/7/21 */ #include "stdio.h" #define Max 1000 int getEveSum(int num){ //求各位的数字和 int sum = 0; while(num

1027: 逃离迷宫(2018年中南大学研究生复试机试题)

1027: 逃离迷宫 时间限制: 1 Sec  内存限制: 128 MB提交: 611  解决: 130[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 PIPI被困在一个迷宫中了!   给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,PIPI想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,PIPI可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,PIPI不能走到迷宫外面去.令人头痛的是,PIPI是个

1022: 淘金(2017年中南大学研究生复试机试题 )

1022: 淘金 时间限制: 1 Sec  内存限制: 128 MB提交: 205  解决: 75[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 在一片n*m的土地上,每一块1*1的区域里都有一定数量的金子.这一天,你到这里来淘金,然而当地人告诉你,如果你挖了某一区域的金子,上一行,下一行,左边,右边的金子你都不能被允许挖了.那么问题来了:你最多能淘金多少? 输入 对于每组数据,第一行两个数n,m,表示土地的长和宽(1<=n,m<=200) 接下来n行,每行m个数,表示每个区域

1021: 机器人走迷宫(2017年中南大学研究生复试机试题 )

1021: 机器人走迷宫 时间限制: 1 Sec  内存限制: 128 MB提交: 339  解决: 71[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 有一个愚蠢的机器人走进一个w*h的迷宫,迷宫里有空地和陷阱.他想要访问迷宫的每个方格,但是它很笨,只会按照指令的方向走.当机器人不能走的时候,也就是下一步会遇到陷阱.迷宫边界或者访问过的格子,它会向右转90度(顺时针旋转90度,不能访问已经访问过的方格,且在原地只转一次,移动后可获得又一次旋转机会).请问这个机器人最多可以经过多

1028: 安全路径(2014年中南大学研究生复试机试题 )

1028: 安全路径 时间限制: 1 Sec  内存限制: 128 MB提交: 228  解决: 96[提交][状态][讨论版] 题目描述 卫斯理小说经常提及外星人,比如蓝血人. 在土星星球有很多城市,每个城市之间有一条或多条飞行通道, 但是并不是所有的路都是很安全的,每一条路有一个安全系数 s,s 是在  0  和1 间的实数 (包括 0 , 1) ,一条从 u 到 v 的通道 P 的安全度为 Safe(P) = s(e1)*s(e2)…*s(ek) e1,e2,ek是P 上的边 ,现在蓝血人

1023: 巨人排队(2017年中南大学研究生复试机试题 )

1023: 巨人排队 时间限制: 1 Sec  内存限制: 128 MB提交: 185  解决: 58[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 巨人国的小学生放假了,老师要给小朋友们排队了.可是这个老师有强迫症,一定要路队上的小朋友按照身高从高到矮排序(也就是排在前面的不能比后面的矮).小朋友呢也很调皮,一旦老师给他排好队就不愿意动了.这个时候小朋友们一个一个的从教室里出来了,每个小朋友一出来老师就要给小朋友安排好位置.请问老师最少要给小朋友排几条路队呢? 输入 对于每组数

1008: 最大连续子序列(2014年中南大学研究生复试机试题 )

1008: 最大连续子序列 时间限制: 1 Sec  内存限制: 128 MB提交: 461  解决: 80[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 给定 K 个整数的序列{ N1,  N2,  ..., NK } ,其任意连续子序列可表示为{ Ni, Ni+1,...,Nj} ,其中1 <= i<= j <= K.最大连续子序列是所有连续子序列中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 } ,其最大连续子序列为{ 11, -4

2015考研 杭电 计算机学院 复试笔试题第一题 JAVA语言解法

杭电 2015年考研 计算机学院 复试笔试第一题 JAVA解法 import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; /* 杭电2015年 计算机学院 复试 笔试题第一题 JAVA解答 * author 刘汪洋 QQ 605283073 * 求出:字符串如:"34223abd#34SB-11--" * 中整数的和 其中-在数字前表示负号,否则为字符 */ pub

计算机考研复试面试常问问题 计算机网络篇(下)

计算机考研复试面试常问问题 计算机网络篇(下) 在复习过程中,我用心查阅并整理了在考研复试面试中可能问到的大部分问题,并分点整理了答案,可以直接理解背诵并加上自己的语言润色!极力推荐打印下来看,效率更高!绝对良心之作! 此系列一共有8篇:编程语言篇|数据结构篇|操作系统篇|组成原理篇|计算机网络篇|数据库篇|软件工程篇|计算机专业英语篇(还未全部完成,敬请期待,你们的支持和关注是我最大的动力!) 个人整理,不可用于商业用途,转载请注明出处. 作者各个平台请搜索:程序员宝藏.快来探索属于你的宝藏吧