最小质因数——埃式筛法

在这里插入图片描述

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

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

//对奇数的倍数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 <iostream>
#include <cmath>
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]);
		}
	}
}

        
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值