时间限制:1000MS 内存限制:256000KB
题目描述
纯粹素数是这样定义的:一个素数,去掉最高位,剩下的数仍为素数,再去掉剩下的数的最高位,余下的数还是素数。这样下去一直到最后剩下的个位数也还是素数。
求出所有N以内的纯粹素数。
输入
仅一行,只有一个数N,N < 10000000;
输出
若干个用一个空格隔开的纯粹素数。
输入样例
23
输出样例
2 3 5 7 13 17 23
得90分的看这里
算法思路:
对于每一个数(无论质数合数)x,筛掉所有小于x最小质因子的质数乘以x的数。比如对于77,它分解质因数是711,那么筛掉所有小于7的质数77,筛掉277、377、5*77。
1、没有重复筛。
我们假设一个合数分解成p1p2p3,并且保证p1<p2<p3。我们知道,筛掉这个合数的机会有:p1和p2p3,p2和p1p3,p3和p1p2。但我们知道,我们选择的那个质数必须小于那个合数的最小质因子。比如p2和p1p3,因为p2>p1,所以这样是筛不到的。唯一会筛的是第一种:p1和p2*p3。
2、没有漏筛。
还是假设把这个合数分解质因数abc,保证a<b<c然后我们设s=bc,s肯定小于刚才那个合数,说明肯定对于它已经筛过,然后a肯定小于s,因为s=bc,并且a是最小的因子。说明a*s也就是这个合数一定筛过。
#include<bits/stdc++.h>
using