杭电计算机2016年机试真题详解

目录

题目一:

1.判断一个数N是否是素数,是的话输出“YES”,否则输出“NO”。(判断2-sqrt(N)是否存在N的因子即可)
输入:
1000000007
100
输出:
YES
NO
思路:
1.素数筛法,一般就是先进行一次暴利搜索,然后在搜索中去除掉2的倍数,去除掉3的倍数,去除掉5的倍数…如此这番,留下来的一定就是素数。
2.有了素数表之后,再想对这些素数进行一定的操作就会稍微简单些了。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define MAX 1000000
bool prime[MAX];
void is_prime(){
    memset(prime,true,sizeof(prime));
    for(int i=2;i<MAX;i++){
        if(prime[i])//如果是素数,那么他的倍数必然不是素数 
        for(int j=2*i;j<MAX;j+=i)
            prime[j]=false; 
    }
    prime[0]=false;prime[1]=false;//讲没有参与到判断的0,1置为非素数 
}
int main(){
    is_prime();
    int n;
    while(scanf("%d",&n)!=EOF){//只要没读到文件结尾就一直继续 
        if(prime[n])
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;       
    }
    return 0;
} 

题目二:

在一个二维平面内有n个点,每个点坐标为(x,y),求最近的两点的距离。(暴力求解即可)
输入:
5
1 2
100 200
1000 2000
1000 1
1 3
输出:
1
思路:
1.一个平面内有n个点,那我只需要进行两个for循环即可,分别算出该点与其他点的距离差。
2.将上个过程中的距离差,使用数组存储起来。
3.对这个数组进行sort排序,输出最小的距离值即可

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<math.h> 
#define MAX 100000
using namespace std;
struct node{
    int x;
    int y; 
}map[MAX];
double  count(int x1,int y1,int x2,int y2){
    return (double)(sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));
}
double len[MAX];//存储距离 
int main(){
    int n;
    cin>>n; 
    int cnt=0;//查看得到的距离的数量 
    for(int i=0;i<n;i++){
        cin>>map[i].x>>map[i].y;        
    }
    for(int i=0;i<n;i++)
        for(int j=i+1;j<n;j++){
            len[cnt++]=count(map[i].x,map[i].y,map[j].x,map[j].y);
        }
    sort(len,len+cnt);
    cout<<len[0]<<endl;
    return 0;
} 

题目三:

有一个文件记录了学生期末考试的几门成绩和学号,求出这几门课程的平均分和总分,并按照总分排序,从高到底,如果成绩相同,按照学号从小到大的顺序。(文件要用c语言的读写操作,结构体排序可做)
为了解决这一道题目,我们首先要解决数据问题,因为这道题的数据是有关文件的读写的,我们可以自己创建一个文件,类似于下图:这里写图片描述
数据如下:以tab作为间隔符

姓名学号语文数学英语
A1204040
B2663968
C39955

思路:
这道题有一个我的知识盲点,就是如何从文件第二行开始取数据
1.编写一个结构体,存储文件中的内容
2.利用C++中的文件的读取方式,去将文件中的数据读取出来。
3.按照要求自定义结构体排序方式,排序后,按序输出。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<fstream>
#define MAX 1010
using namespace std; 
struct stuinfo{
    char name[101];
    int id;
    int chinese;
    int math;
    int english;
}stu[MAX];
bool cmp(stuinfo a,stuinfo b){
    int suma=a.chinese+a.english+a.math;
    int sumb=b.chinese+b.english+b.math;
    if(suma==sumb)//分数相同选择学号小的 
        return a.id<b.id;
    else
        return suma>sumb;//分数不同选择分数大的 
}
int main(){
    fstream in;
    in.open("data.txt",ios::in);
    char line[1000];
    in.getline(line,1000);//处理掉第一行的数据 
    int cnt=0;
    while(in>>stu[cnt].name>>stu[cnt].id>>stu[cnt].chinese>>stu[cnt].math>>stu[cnt].english)
        cnt++;//逐行录入该文件每一行的内容 
    sort(stu,stu+cnt,cmp);//进行排序
    for(int i=0;i<cnt;i++)
        cout<<stu[i].name<<" "
        <<stu[i].id<<" "
        <<stu[i].chinese<<" "
        <<stu[i].math<<" "
        <<stu[i].english<<" "
        <<endl; 
    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)。
思路:
这道题和17年的题目十分的相似
1.构造一个模块儿count用来计算两个二维矩阵对应位置的差和.
题意没弄明白,但是大概思路还是比较清晰的,你首先要构造一个模块儿实现题目要求指定的功能。
2.类似于17年的dfs对这道题进行深度搜索

1.递归出口是程序已经运行到了最后一行。
2.该行的每一个位置进行count模块儿计算,并将这个数据存储到一个二维数组里面,该二维数组的坐标刚好是图的坐标

3.将得到的二维数组进行排序,输出值最小的,数组的坐标。(这一步要做一个控制,因为很有可能会有多个同样最小的坐标),把这些坐标输出出来,我们就能得到题目要求的答案。

#include<stdio.h>
#include<string.h>
#include<iostream>
#define MAX 1000
using namespace std;
int map_1[MAX][MAX];
int map_2[MAX][MAX];
int N,M;
int n,m;
int main(){
    cin>>N>>M;
    for(int i=0;i<N;i++)
        for(int j=0;j<M;j++)
            cin>>map_1[i][j];
    cin>>n>>m;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            cin>>map_2[i][j];
    return 0;
}

对不住,对不住,实在是看不懂题目讲的是啥,只能做到把图存起来。如果有大佬看明白题目所讲含义,请留言
再吐槽一句,题目真的完全不知所云。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值