最小质因数——埃式筛法

最小质因数——埃式筛法_第1张图片

观测输入组数 和数字的大小
普通的素数判断方法就显得力不从心了
利用数学的性质,就可以很好的解决该问题

整体思路是抓奇数 然后对奇数进行翻倍
原理是:奇数的倍数 一定不是质数
所以每个奇数的倍数可以 将每个非质数的数都赛选出来
如果没有筛到的数 那就一定是质数
所以 开头写一个循环 让每个数等于自己的本身

//对奇数的倍数j进行筛出 
// 那么i一定是j的因子 
// 但是  3 9 都是18的因子 
// 所以一定要保存最小的因子 
// 题目要求的是 质因子 

问题来了 ,如何判定i是不是质数呢?(i是奇数)
打个比方 i=9 or 21 的时候 (最开始的i)
首先因为i不是质数 i一定有因子
那么i的因子一定是奇数
因为奇数*奇数才等于奇数
所以 i的因子 k一定是奇数
再假设k是非质数 那么k的因子也还是 奇数
… 以此循环直到 因子为质数
那么这个最终的因子的倍数 一定可以筛出 最开始i的倍数
所以我们不需要考虑i是否是质数
直接筛 就完事了!
18 27 的

            
#include 
#include 
using namespace std;
const int N = 1e6;
int isprime[1000005] = {};
int main()
{

	for (int i = 1; i <= N; i++)//最大就是自己本身
	{
		isprime[i] = i;
	}
	for (int i = 3; i < sqrt(N); i+=2)//抓奇数
	{
	//对奇数的倍数j进行筛出 
	// 那么i一定是j的因子 
	// 但是  3 9 都是18的因子 
	// 所以一定要保存最小的因子 	
	for (int j = i * 2; j <= N; j += i)
		{
			if (isprime[j]>i)//使得i是最小的
			{
				isprime[j] = i;
			}
		}
	}
	int t;
	scanf("%d", &t);
	while (t--)
	{
		int x;
		scanf("%d", &x);
		if (x % 2 == 0)//偶数最小因子一定是2 
		{
			printf("2\n");
		}
		else
		{
			printf("%d\n", isprime[x]);
		}
	}
}

        

你可能感兴趣的:(最小质因数——埃式筛法)