首页 > 代码库 > 考研机试题(2014)

考研机试题(2014)

1.求一串数中大于1素数之和
输入输入个数  数字  不超过100个数 不超过10组 多组输入  0结束

输入 
4 1 2 3 4
5 1 2 3 4 5
0
输出

5

10

#include <stdio.h>
#define MAX 10

bool isPrime(int n){
//判断是否是素数

	bool flag = true;

	if( n <=1)  return false;

	for(int i = 2; i*i <= n; i++){
		if(n % i == 0){
			flag = false;
			break;
		}
	}

	return flag;
}

int main(){
	int res[MAX];
	int sum,num,n,cnt;
	cnt = 0;

	while(scanf("%d",&n) != EOF && n != 0){
		sum = 0;
		for(int i = 0; i < n; i++){
			scanf("%d",&num);
			if(isPrime(num))
				sum += num;
		}
		res[cnt++] = sum;
	}

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



2.压缩字符串
输入只含A-Z的字符串 不超过1000个字母 将连续相同字母压缩为重复次数+字幕(这个忘记是多组输入还是单组了)

输入
ABBCCC
输出
A2B3C

#include <stdio.h>
#include <string.h>
#define N 1000

char str[N];
char ans[N];

int main(){


	while(scanf("%s",str) != EOF){
		int len = strlen(str);

	    ans[0] = str[0];
		int i = 1,j = 0,count = 1;
	    char pre = str[0];

		while(1){
			char tmp = str[i];
			if(tmp != pre){
				j++;
				if(count >= 2)
				  ans[j++] = count+'0';
				count = 1;
				ans[j] = str[i++];
				pre = tmp;
			}else{
				count++;
				i++;
			}
			if(tmp == '\0')
				break;
		}

		puts(ans);
		printf("\n");

	}
	return 0;
}


3.机器人走迷宫
迷宫由 N W S E 组成  踩到N向上走一格 踩到W 向左走一格 踩到S向下走一格 踩到E 向右走一格
输入迷宫行数  列数  不大于10 机器人初始列数(注意 这个列数是从1开始数的) 判断能否走出迷宫。能走出输出步数
多组输入 遇 0 0 0 结束输入

输入
4 6 5
NNNNSN
NNNSWN
NNSWNN
NSWNNN
3 5 2
NSNNNN
NSWNNN
NENNNN
0 0 0
输出
7
no

#include <stdio.h>
#define MAX 100
char buf[MAX][MAX];
bool mark[MAX][MAX];

int main(){

	int m,n,sx,sy;
	while(scanf("%d%d%d%d",&m,&n,&sx,&sy) != EOF){
		if(m == 0 && n == 0)
			break;
		getchar();
		for(int i = 0; i < m; i++){
			scanf("%s",buf[i]);
			getchar();
		}

		
		for( i = 0; i < m; i++){
			for(int j = 0; j < n; j++)
				mark[i][j] = false;
		}
		int count = 0;
		while(1){

		//	printf("%d %d\n",sx,sy);

			if(sx < 0 || sx > m-1 || sy < 0 || sy > n-1){
				printf("%d\n",count);
				break;
			}
			if(mark[sx][sy]){
				printf("no\n");
				break;
			}
			switch(buf[sx][sy]){
			case 'W':mark[sx][sy] = true;sy--;count++;break;
			case 'E':mark[sx][sy] = true;sy++;count++;break;
			case 'S':mark[sx][sy] = true;sx++;count++;break;
			case 'N':mark[sx][sy] = true;sx--;count++;break;
			}
		
		}
	
	}
	return 0;
}


4.成绩排行(这个具体排序的顺序记不清了 但是就是读取文件+ 排序)
从文件Score。txt中读取学生信息 对其进行排序 学生信息包括学号不高于20位 题目数不超过10 分数  首先按照回答题数从大往小排  题数一样的按照分数从小往大排。

文件内容
CS00000001 4 110
CS00000002 4 120
CS00000003 5 150


输出
CS00000003 5 150
CS00000001 4 110
CS00000002 4 120

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

#define N 1000

struct sts{
	char no[30];
	int  num;
	int  score;	
}stu[N];

bool cmp(sts A, sts B){
	if(A.num != B.num)
		return A.num > B.num;
	if(A.score != B.score)
		return A.score < B.score;
	else{
	    int tmp = strcmp(A.no,B.no);	
		return tmp < 0;
	}
}

int main(){

	FILE *fp;
	if((fp = fopen("Score.txt","r")) == NULL){
		printf("Read file failed\n");
		return -1;
	}
	int i = 0;
	while(!feof(fp)){
		fscanf(fp,"%s%d%d",stu[i].no,&stu[i].num,&stu[i].score);
	    i++;
	}
	sort(stu,stu+i,cmp);

	for(int j = 0; j < i; j++)
		printf("%s %d %d\n",stu[j].no,stu[j].num,stu[j].score);
	fclose(fp);

	return 0;
}


考研机试题(2014)