文章目录
Contest100000591 - 《算法笔记》5.4小节——数学问题->素数
5.4小节——数学问题->素数
5.4.1 素数的判断
//5.4.1素数判断
bool isPrime(int n)
{
if(n <= 1) return false;//特判
int sqr = (int)sqrt(1.0 * n);//根号n,需要cmath头文件,且sqrt参数要求是浮点数
for(int i=2;i<=sqr;i++)//遍历2-根号n
{
if(n%i == 0)//n是i的倍数,则n不是素数
return false;
}
return true;
}
5.4.2 素数表的获取
素数打表
//5.4.2素数表的获取
const int maxn = 101;//表长
int prime[maxn],pNum = 0;//prime数组存放所有素数,pNum为素数个数
bool p[maxn] = {0};//p[i] == true表示i是素数
void Find_Prime()
{
for(int i = 1;i < maxn;i++)//不能写成i <= maxn
{
if(isPrime(i) == true)
{
prime[pNum++] = i;//是素数则把i存入prime数组
p[i] = true;
}
}
}
//求解100以内的所有素数
#include<cstdio>
#include <cmath>
bool isPrime(int n)//判断n是否为素数
{
if(n <= 1) return false;//特判
int sqr = (int)sqrt(1.0 * n);//根号n,需要cmath头文件,且sqrt参数要求是浮点数
for(int i=2;i<=sqr;i++)//遍历2-根号n
{
if(n%i == 0)//n是i的倍数,则n不是素数
return false;
}
return true;
}
const int maxn = 101;//表长
int prime[maxn],pNum = 0;//prime数组存放所有素数,pNum为素数个数
bool p[maxn] = {0};//p[i] == true表示i是素数
void Find_Prime()//求素数表
{
for(int i = 1;i < maxn;i++)//不能写成i <= maxn
{
if(isPrime(i) == true)
{
prime[pNum++] = i;//是素数则把i存入prime数组
p[i] = true;
}
}
}
int main()
{
Find_Prime();//注意别漏写
for(int i=0;i<pNum;i++)
{
printf("%d ",prime[i]);
}
return 0;
}
素数筛
//素数筛
const int maxn = 101;//表长
int prime[maxn],pNum = 0;//prime数组存放所有素数,pNum为素数个数
bool p[maxn] = {0};//p[i] == true表示i是素数
for(int i = 2;i < maxn; i++)//从2开始,i<maxn结束,注意不能写成i<=maxn
{
if(p[i] == false)//如果i是素数
{
prime[pNum++] = i;//把素数i存到prime数组中
for(int j = i+i;j < maxn;j += i)
{//筛去所有i的倍数,循环条件不能写成j <= maxn
p[j] = true;
}
}
}
//素数筛求解100以内的所有素数
#include<cstdio>
#include <cmath>
//素数筛
const int maxn = 101;//表长
int prime[maxn],pNum = 0;//prime数组存放所有素数,pNum为素数个数
bool p[maxn] = {0};//p[i] == true表示i是素数
void Find_Prime()
{
for(int i = 2;i < maxn; i++)//从2开始,i<maxn结束,注意不能写成i<=maxn
{
if(p[i] == false)//如果i是素数
{
prime[pNum++] = i;//把素数i存到prime数组中
for(int j = i+i;j < maxn;j += i)
{//筛去所有i的倍数,循环条件不能写成j <= maxn
p[j] = true;
}
}
}
}
int main()
{
Find_Prime();//注意别漏写
for(int i=0;i<pNum;i++)
{
printf("%d ",prime[i]);
}
return 0;
}
例题PAT B1013数素数
题目链接:
https://pintia.cn/problem-sets/994805260223102976/problems/994805309963354112
//PATB1013数素数
#include<cstdio>
#include <cmath>
#include <iostream>
using namespace std;
//素数筛
const int maxn = 1000010;//表长
int prime[maxn],pNum = 0;//prime数组存放所有素数,pNum为素数个数
bool p[maxn] = {0};//p[i] == true表示i是素数
void Find_Prime(int n)//只需要n个素数,超过时候即可结束
{
for(int i = 2;i < maxn; i++)//从2开始,i<maxn结束,注意不能写成i<=maxn
{
if(p[i] == false)//如果i是素数
{
prime[pNum++] = i;//把素数i存到prime数组中
if(pNum >= n) break;//只需要n个素数,超过时候即可结束
for(int j = i+i;j < maxn;j += i)
{//筛去所有i的倍数,循环条件不能写成j <= maxn
p[j] = true;
}
}
}
}
/*不知道咋不对
int main()
{
int m,n;
int flag = 0;
while(cin>>m>>n)
{
Find_Prime(n);//注意别漏写
for(int i=m-1;i<n;i++)
{
cout<<prime[i];
flag++;
if(flag == 10)
{
flag = 0;
cout<<endl;
}
else
{
cout<<" ";
}
}
}
return 0;
}
*/
int main()
{
int m,n;
int flag = 0;
while(cin>>m>>n)
{
Find_Prime(n);//注意别漏写
for(int i=m;i<=n;i++)
{
cout<<prime[i-1];
flag++;
if(flag % 10!=0 && i < n)
{
cout<<" ";
}
else
{
cout<<endl;
}
}
}
return 0;
}
Codeup习题
100000591 《算法笔记》5.4小节——数学问题->素数
题目链接:http://codeup.cn/contest.php?cid=100000591
1945-Problem-A-素数
题目链接:http://codeup.cn/problem.php?cid=100000591&pid=0
//1945 Problem A 素数
未通过,输出超限50%
#include<cstdio>
#include <cmath>
#include <iostream>
using namespace std;
//素数筛
const int maxn = 10005;//表长
int prime[maxn],pNum = 0;//prime数组存放所有素数,pNum为素数个数
bool p[maxn] = {0};//p[i] == true表示i是素数
int tep[maxn];
void Find_Prime(int n)//只需要n个素数,超过时候即可结束
{
for(int i = 2;i < maxn; i++)//从2开始,i<maxn结束,注意不能写成i<=maxn
{
if(p[i] == false)//如果i是素数
{
prime[pNum++] = i;//把素数i存到prime数组中
if(pNum >= n) break;//只需要n个素数,超过时候即可结束
for(int j = i+i;j < maxn;j += i)
{//筛去所有i的倍数,循环条件不能写成j <= maxn
p[j] = true;
}
}
}
}
int main()
{
int n;
while(cin>>n)
{
Find_Prime(n);//注意别漏写
int flag = 0;int cnt=0;
for(int i=0;prime[i] < n;i++)
{
//提取个位
if(prime[i] % 10 == 1)
{
tep[cnt++] = prime[i];//用数组暂存满足要求的素数
}
}
if(cnt == 0)
cout<<-1<<endl;
else
{
for(int i=0;i<cnt-1;i++)//按要求格式输出素数
{
cout<<tep[i]<<" ";
}
cout<<tep[cnt-1]<<endl;
}
}
return 0;
}
1946.Problem-B-Prime-Number
题目链接:http://codeup.cn/problem.php?cid=100000591&pid=1
//1946.Problem-B-Prime-Number
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 1000010;//表长
int prime[maxn],pNum = 0;
bool p[maxn] = {0};
void FindPrime(int n)
{
for(int i=2;i<maxn;i++)
{
if(p[i] == false)//注意是双等号
{
prime[pNum++] = i;
if(pNum >= n) break;
for(int j=i+i;j<maxn;j += i)//素数的整数倍皆不是素数
{
p[j] = true;
}
}
}
}
int main()
{
int k;
FindPrime(maxn);
while(cin>>k)
{
// FindPrime(k);//放在此处会使相邻两次的素数筛发生串扰
cout<<prime[k-1]<<endl;
}
return 0;
}
2125-Problem-C-Goldbach’s-Conjecture
题目链接:http://codeup.cn/problem.php?cid=100000591&pid=2
//2125-Problem-C-Goldbach's-Conjecture
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
bool isPrime(int a)//素数判断函数
{
if(a == 2) return true;
if(a % 2 == 0) return false;
for(int i=2,Sqrt = sqrt(a);i <= Sqrt;i++)
{
if(!(a%i))
return false;
}
return true;
}
int main()
{
int n,cnt;
while(cin>>n && n)//输入多个数据,以0结尾
{
cnt=0;
for(int i=2;i<=n/2;i++)//从2循环到n/2
{
if(isPrime(i))//若存在两个素数之和为该合数,则计数加一
{
if(isPrime(n-i))
cnt++;
}
}
cout<<cnt<<endl;
}
return 0;
}
总结下:
素数的基本判断函数以及打表,素数筛比较常用