杭电2016复试上机真题

ps:题是别的地方copy过来的,代码是自己的

第一题:

判断一个数N是否是素数,是的话输出“YES”,否则输出“NO”。(素数:除了1和自身以外,没办法被其它自然数整除的数(即质数,0和1不在讨论范畴内)
输入: 
1000000007 
100 
输出: 
YES 
NO 

#include<stdio.h>
#include<math.h>

int main(){
	unsigned int num;  // 表示0~4294967295 
	
	while(scanf("%d",&num) != EOF){
		int flag = 0;
		for(int i = 2;i <= (unsigned int)sqrt((double)num);i++){   //讨论 2~sqrt(num)之前是否整除 
			if(num % i == 0){
				flag = 1;
				break;		
			}
		}
		if(flag){
			printf("NO\n");
		}
		else{
			printf("YES");
		}
	}	
	return 1;
} 

第二题:

在一个二维平面内有n个点,每个点坐标为(x,y),求最近的两点的距离。
输入: 

1 2 
100 200 
1000 2000 
1000 1 
1 3 
输出: 
1.000000 

#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>

using namespace std;

struct point{
	int x;
	int y;
};

int sum(int a){      //4个点,每两点之间存在距离,统计所有距离,则有 3+2+1种情况 
	int sum = 0;
	for(int i = 1;i < a;i++){
		sum += i;
	}
	return sum;
}

bool cmp(double a,double b){
	return a < b;
}

int main(){
	int num;
	scanf("%d",&num);
	struct point* p = (struct point*)malloc(sizeof(struct point)*num);
	
	for(int i = 0;i < num;i++){
		scanf("%d%d",&(p + i)->x,&(p + i)->y);
	}	
	
	int len = 0;
	double* result = (double*)malloc(sizeof(double) * sum(num));	
	for(int i = 0;i < num - 1;i++){
		for(int j = i + 1;j < num;j++){
			*(result + len) = sqrt((double)((p[i].x - p[j].x) * (p[i].x - p[j].x) + (p[i].y - p[j].y) * (p[i].y - p[j].y)));
			len++;
		}
	}
	
	sort(result,result + len,cmp);
	printf("%lf",*result);
	
	return 1;
} 

第三题:

有一个文件记录了学生期末考试的几门成绩和学号,求出这几门课程的总分,并按照总分排序,从高到底,如果成绩相同,按照学号从小到大的顺序。 

题和图片都是上网找的,不一定准确。

注:id是char型的

#include<cstdio>
#include<cstring>
#include<algorithm> 

using namespace std;

struct student{//姓名 学号 语文 数学 英语
    char name[20];
    char id[20];  
    int chinese;
    int math;
    int english;
};

bool cmp(student a,student b){
	int suma = a.chinese + a.math + a.english;
	int sumb = b.chinese + b.math + b.english;
	if(suma == sumb){                      // 成绩相等,学号从小到大 
		if(strcmp(a.id,b.id) < 0){
			return true;
		}
		else{
			return false;
		}
	}
	else{
		return suma > sumb;    
	}	
}


int main(){
	FILE* fp;
	fp = fopen("student.txt","r+");
	struct student s[100];
	int i = 0;
	char tmp[101];
	fgets(tmp,100,fp);   // 跳过第一行  ,fgets读完这一行或者独一百个字符 
			
	while(!feof(fp)){ 
    	fscanf(fp,"%s %s %d %d %d\n",&s[i].name,&s[i].id,&s[i].chinese,&s[i].math,&s[i].english);
		i++;    //记录行数 
	}
	
	sort(s,s + i,cmp); 
	for(int j = 0;j < i;j++){				
		printf("%s %s %d %d %d\n",s[j].name,s[j].id,s[j].chinese,s[j].math,s[j].english);
	}
	fclose(fp);
	return 0;
}

第四题:

有一个由数字组成的二维矩阵,大小为N*M;还有一个大小为n*m小二维矩阵,想象将小二维矩阵上面(小矩阵左上角位置和大矩阵某个位置对应放弃),在不同的位置,这两个二维矩阵对应位置的数字绝对值之差和一般是不同的,求这个最小绝对值之差的和,并求出对应的大矩阵位置。(暴力求解,枚举大矩阵的位置即可) 

输入4 4 

1 2 3 4 

4 5 6 8 

1 2 3 4 

5 6 7 8 

2 2 

2 2 

4 5 

输出:最小距离为0,对应的坐标起始点(1,1)、(3,1)。 

没找到靠谱的题源,本题先空缺

猜你喜欢

转载自blog.csdn.net/jh8w8m/article/details/87710288