目录
1.判断一个数N是否是素数,是的话输出“YES”,否则输出“NO”。(判断2-sqrt(N)是否存在N的因子即可)
输入:
1000000007
100
输出:
YES
NO
思路:
1.素数筛法,一般就是先进行一次暴利搜索,然后在搜索中去除掉2的倍数,去除掉3的倍数,去除掉5的倍数…如此这番,留下来的一定就是素数。
2.有了素数表之后,再想对这些素数进行一定的操作就会稍微简单些了。
#include
#include
#include
#include
using namespace std;
#define MAX 1000000
bool prime[MAX];
void is_prime(){
memset(prime,true,sizeof(prime));
for(int i=2;iif(prime[i])//如果是素数,那么他的倍数必然不是素数
for(int j=2*i;jfalse;
}
prime[0]=false;prime[1]=false;//讲没有参与到判断的0,1置为非素数
}
int main(){
is_prime();
int n;
while(scanf("%d",&n)!=EOF){//只要没读到文件结尾就一直继续
if(prime[n])
cout<<"YES"<else
cout<<"NO"<return 0;
}
在一个二维平面内有n个点,每个点坐标为(x,y),求最近的两点的距离。(暴力求解即可)
输入:
5
1 2
100 200
1000 2000
1000 1
1 3
输出:
1
思路:
1.一个平面内有n个点,那我只需要进行两个for循环即可,分别算出该点与其他点的距离差。
2.将上个过程中的距离差,使用数组存储起来。
3.对这个数组进行sort排序,输出最小的距离值即可
#include
#include
#include
#include
#include
#include
#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;icin>>map[i].x>>map[i].y;
}
for(int i=0;ifor(int j=i+1;jmap[i].x,map[i].y,map[j].x,map[j].y);
}
sort(len,len+cnt);
cout<0]<return 0;
}
有一个文件记录了学生期末考试的几门成绩和学号,求出这几门课程的平均分和总分,并按照总分排序,从高到底,如果成绩相同,按照学号从小到大的顺序。(文件要用c语言的读写操作,结构体排序可做)
为了解决这一道题目,我们首先要解决数据问题,因为这道题的数据是有关文件的读写的,我们可以自己创建一个文件,类似于下图:
数据如下:以tab作为间隔符
姓名 | 学号 | 语文 | 数学 | 英语 |
---|---|---|---|---|
A | 1 | 20 | 40 | 40 |
B | 2 | 66 | 39 | 68 |
C | 3 | 99 | 5 | 5 |
思路:
这道题有一个我的知识盲点,就是如何从文件第二行开始取数据
1.编写一个结构体,存储文件中的内容
2.利用C++中的文件的读取方式,去将文件中的数据读取出来。
3.按照要求自定义结构体排序方式,排序后,按序输出。
#include
#include
#include
#include
#include
#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.idelse
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;icout<" "
<" "
<" "
<" "
<" "
<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
#include
#include
#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;ifor(int j=0;jcin>>map_1[i][j];
cin>>n>>m;
for(int i=0;ifor(int j=0;jcin>>map_2[i][j];
return 0;
}
对不住,对不住,实在是看不懂题目讲的是啥,只能做到把图存起来。如果有大佬看明白题目所讲含义,请留言
再吐槽一句,题目真的完全不知所云。