学习对象:
本期学习的是判断质数。
内容:
哈喽,好久不见,差点忘记这个号了,上次讲了最大公约数和最小公倍数问题,额,有空会去改一下文章。这一次,让我们走进质数问题。
警示,一定要把全文看完,否则得到的知识不完全
警示,一定要把全文看完,否则得到的知识不完全
警示,一定要把全文看完,否则得到的知识不完全
警示,一定要把全文看完,否则得到的知识不完全
来,让我们现在先看一下质数的定义:质数又称素数.指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数.换句话说,只有两个正因数(1和自己)的自然数即为素数.比1大但不是素数的数称为合数.1和0既非素数也非合数.
来,让我们抓一下重点
1.大于一的数 2.除了1和此整数自身外,没法被其他自然数整除的数
兄弟们,有突破口了呀,我只需要
#include<bits/stdc++.h>
using namespace std;
long long n;
int main(){
cin>>n;
for(int i=2;i<n;i++){
if(n%i!=0){//判断是否可以整除,如可以,则不符合前文总结的条件2,则不是质数
cout<<"NO";
return 0;//终止程序
}
}
cout<<"YES";
return 0;
}
就可以判断质数了,看,是不是符合条件2.
不过,有没有感觉少了什么{
条件有两条,你只记得条件二,真的是服了你了作者
}
阿对对对,条件一少了,这时候,同胞们就要长个心眼了,一遇到与质数有关的题目,记得关注“1”,1这个数需要特判。记住1,记住1,记住1,重要的事情说三遍。
接下来,又有一个新的问题出现了,时间复杂度超了,此时时间复杂度为O(n-1)一个数,一旦数字大起来,数字多起来。塴,程序就崩了。😭
接下来,进入重要时刻,笔记请做好。
1.
#include<bits/stdc++.h>
using namespace std;
long long n;
int main(){
cin>>n;
for(int i=2;i<=sqrt(n);i++){
if(n%i!=0){//判断是否可以整除,如可以,则不符合前文总结的条件2,则不是质数
cout<<"NO";
return 0;//终止程序
}
}
cout<<"YES";
return 0;
}
sqrt(n)的意义,有没有人想起来。
众所周知,n的因数最大是平方根(n)。
所以说,自己理解吧
2.埃氏筛选法
这个方法的发明人好像就是第一个测量出地球周长的人,感兴趣的可以去百度看看,在此不多赘述。方法意思就是,
例如要求出n个数以内有多少个质数,(保证n<=10000000),这时候,使用之前单求个体的方法就会超时,这时候,就让我们把目光转移到埃氏筛数法。定义:要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。
废话不多说,上代码
#include<bits/stdc++.h>
using namespace std;
long long n,aus;
bool a[10000005];
int main(){
cin>>n;
for(int i=2;i<=sqrt(n);i++){
if(a[i]==0){
for(int j=i*2;j<=n;j+=i){
a[j]=1;
}
}
}
for(int i=2;i<=n;i++){
if(a[i]==1)aus++;
}
cout<<aus;
return 0;
}
标准模板,加油,努力前进。
我要去写作业了,苦逼的初中生