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),求最近的两点的距离。
输入:
5
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)。
没找到靠谱的题源,本题先空缺