Contest100000591 - 《算法笔记》5.4小节——数学问题->素数

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;
}

总结下:

素数的基本判断函数以及打表,素数筛比较常用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李霁明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值