Almost Prime Numbers
Def of Almost Prime Numbers:
自身不是素数,但只有一个素数因子,
由唯一分解定理可得,这样的数只能是
Solution1:
#include<stdio.h>
#include<iostream>
#include<cmath>
#include<math.h>
#include<string>
#include<string.h>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=1e6+10;
//欧拉筛法( O(n) )
int np=0,p[maxn],v[maxn+10];
int gg(int n){
for(int i=2;i<=n;i++){
if(!v[i]) p[++np]=i;//此时的i为某个质数
for(int j=1;j<=np && i*p[j]<=n;j++){
v[i*p[j]]=1; //用这个合数的最小质因子去筛掉这个合数
if(i%p[j]==0) break;
}
}
return np;
}
int t;
ll l,r;
int main(){
cin>>t;
gg(maxn);
while (t--)
{
scanf("%lld%lld",&l,&r);
ll ans=0;
for(int i=1;i<=np;i++)
{
for(ll num =(ll)p[i]*p[i];num<=r;num*=p[i])
{
if(num>=l) ans++;
}
}
printf("%lld\n",ans);
}
return 0;
}
Solution2:
(本来以为用log(函数)代替循环会更快的 )
其实因为log()运算其实也是手工运算的模拟,而且还会计算到一定精度,当然会慢很多。
#include<stdio.h>
#include<iostream>
#include<cmath>
#include<math.h>
#include<string>
#include<string.h>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=1e6+10;
//欧拉筛法( O(n) )
int np=0,p[maxn],v[maxn+10];
int gg(int n){
for(int i=2;i<=n;i++){
if(!v[i]) p[++np]=i;//此时的i为某个质数
for(int j=1;j<=np && i*p[j]<=n;j++){
v[i*p[j]]=1; //用这个合数的最小质因子去筛掉这个合数
if(i%p[j]==0) break;
}
}
return np;
}
int t;
ll l,r;
int main(){
cin>>t;
gg(maxn);
while (t--)
{
scanf("%lld%lld",&l,&r);
ll ans=0;
for(int i=1;i<=np;i++)
{
if(p[i]>r)
break;
int lp = ceil(log(l)/log(p[i]));
int rp =floor(log(r)/log(p[i]));
if(rp<=1)
continue;
if(lp<=1 && p[i]*p[i]<=r)
lp=2;
ans+= rp-lp+1;
}
printf("%lld\n",ans);
}
return 0;
}
来源:CSDN
作者:好喜欢萨摩猪
链接:https://blog.csdn.net/qq_44846324/article/details/104591654