![在这里插入图片描述](https://img-blog.csdnimg.cn/20200614013820382.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1RLS0RPVVpJ,size_16,color_FFFFFF,t_70)
观测输入组数 和数字的大小 普通的素数判断方法就显得力不从心了 利用数学的性质,就可以很好的解决该问题
整体思路是抓奇数 然后对奇数进行翻倍 原理是:奇数的倍数 一定不是质数 所以每个奇数的倍数可以 将每个非质数的数都赛选出来 如果没有筛到的数 那就一定是质数 所以 开头写一个循环 让每个数等于自己的本身
//对奇数的倍数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
//对奇数的倍数j进行筛出
// 那么i一定是j的因子
// 但是 3 9 都是18的因子
// 所以一定要保存最小的因子
for (int j = i * 2; j
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]);
}
}
}
|