基本思想:素数的倍数一定不是素数
实现方法:用一个长度为N+1的数组保存信息(0表示素数,1表示非素数),先假设所有的数都是素数(初始化为0),从第一个素数2开始,把2的倍数都标记为非素数(置为1),一直到大于N;然后进行下一趟,找到2后面的下一个素数3,进行同样的处理,直到最后,数组中依然为0的数即为素数。
如果n*n > 范围最大值就跳出。
import math
def count_prime(N):
n = int(math.sqrt(N) + 1)
arr = [True] * (N + 1)
for i in range(2, n):
for j in range(2, N):
if i * j <= N:
arr[i * j] = False
else:
break
return sum(arr) - 2
start, end = map(int, input().split())
print(count_prime(end) - count_prime(start - 1))
要注意start要减去1。
def primeNum(m, n): # 正面思路时间复杂度不过关 res = 0 for i in range(m, n+1): for j in range(2, int(i**0.5)+1): if i%j == 0: break else: res += 1 return res def prime(n): # 类似动态规划的思想 res = [1]*(n+1) for i in range(2, int(n**0.5)+1): # n**0.5可能不是int类型,注意 for j in range(2, n): if i*j <= n: res[i*j] = 0 # 不是素数 else: break return sum(res) if __name__ == "__main__": m, n = map(int, input().split()) print(prime(n) - prime(m-1)) # 注意包括边界
#include <iostream> #include <stdio.h> #include <cmath> using namespace std; int main(){ int count=0; int M; int N; cin >> M; cin >> N; int flag=0; for(int i=M; i<=N; i++){ flag=0; for(int j=2; j <= sqrt(i); j++){ if(i%j==0){ flag=1; break; } } if(flag==0){ count++; } } cout << count; return 0; }
#include <bits/stdc++.h> using namespace std; bool isPrime(int n) //判断一个数是否为素数 { if(n<=1) { return false; } else { for (int i = 2; i <= sqrt(n); i++) { if(n%i == 0) { return false; } } return true; } } int main() { int M,N; cin >> M >> N; int cnt = 0; //记录区间内素数的个数 for(int i = M; i <= N; i++) { if(isPrime(i)) { cnt++; } } cout << cnt << endl; return 0; }
#include<bits/stdc++.h> using namespace std; int main() { int m,n,sum=0;cin>>m>>n; for(int i=m;i<=n;i++) { int flag=0; for(int j=2;j*j<=i;j++) if(i%j==0) {flag=1;break;} if(!flag) sum++; } cout<<sum; }
#include<bits/stdc++.h> using namespace std; int main(){ int m,n; while(cin>>m>>n){ int a[n+1],cnt=0; memset(a,0,sizeof(a)); for(int i=m;i<=n;i++){ if(!a[i]){ // a[i]是素数 ++cnt; for(int j=i*2;j<=n;j+=i) a[j]=1; } } cout<<cnt<<endl; } }
using System; using System.Collections.Generic; //输入M、N,1 < M < N < 1000000,求区间[M,N]内的所有素数的个数。素数定义:除了1以外,只能被1和自己整除的自然数称为素数 namespace HalloWrold { class ClassMain { static int lastLength = 0; static int b = 2; static void Main(string[] args) { //System.Console.ForegroundColor = System.ConsoleColor.Yellow; int n, m; string num = Console.ReadLine(); n = Convert.ToInt32(num.Substring(0, num.IndexOf(" "))); m = Convert.ToInt32(num.Substring(num.LastIndexOf(" "))); int count = 0; List<int> arr = new List<int>(); //素数数组 arr.Add(2); for (int i = 2; i <= m; i++) { int t = jd(arr.Count); for (int j = 0; j < t; j++) { if (i % arr[j] == 0) break; if (j ==t- 1) { count++; arr.Add(i); } } } if (m > 1) count++; Console.WriteLine(count); } public static int jd(int count) { if (lastLength!= count.ToString().Length+1) //说明位数变化 { b *= 2; lastLength = count.ToString().Length + 1; } if (count <1000) return count; else { return count / b; } } } }
#include<cstdio> int m,n,cnt2,cnt,v[1000010],p[200010]; int main() { scanf("%d%d",&m,&n); for (int i=2; i<=n; ++i) { //线性筛 if (i==m) cnt2=cnt; //记录[1,m)区间内的素数个数 if (!v[i]) v[i]=p[++cnt]=i; for (int j=1; j<=cnt; ++j) { int t=p[j]; if (1ll*t*i>n||t>v[i]) break; v[t*i]=t; } } printf("%d\n",cnt-cnt2); return 0; }
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); int M=sc.nextInt(); int N=sc.nextInt(); boolean[] isPrime=new boolean[N+1]; //注意2为素数 isPrime[2]=true; for(int i=3;i<N+1;i++){ if((i&1)==1){ //先让奇数为true isPrime[i]=true; } } for(int i=3;i<=Math.sqrt(N);i+=2){ if(isPrime[i]){ for(int j=i+i;j<=N;j+=i){ isPrime[j]=false; } } } int count=0; for(int i=M;i<=N;i++){ if(isPrime[i]){ count++; } } System.out.println(count); } }
#include<iostream> #include<vector> #include<math.h> using namespace std; int getParm(int m,int n); int main(){ int m,n; cin >> m >> n; cout << getParm(m,n) << endl; } int getParm(int m,int n){ //求m,n之间有多少个素数 //统计2到m之间的所有素数 vector<int> param; int count = 0; param.push_back(2); count++; for(int i = 3; i < m;i++){ vector<int>::iterator it; for(it = param.begin(); *it < sqrt(i); it++){ if( i % (*it) == 0){ break; } } if(*it > sqrt(i)){ param.push_back(i); } } for(int i = m > 3 ? m : 3; i <= n;i++){ vector<int>::iterator it; for(it = param.begin(); *it <= sqrt(i);it++){ if( i % (*it) == 0){ break; } } if(*it > sqrt(i)){ param.push_back(i); count++; } } return count; }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * 埃拉托斯特尼筛法 O(n*log(log(n))) * @author wylu */ public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] strs = br.readLine().split(" "); int m = Integer.parseInt(strs[0]), n = Integer.parseInt(strs[1]); System.out.println(simpleSieve(m, n)); } private static int simpleSieve(int m, int n) { //元素值为false表示该元素下标值为素数 boolean[] mark = new boolean[n + 1]; for (int i = 2; i <= n; i++) { if (!mark[i]) { for (int j = 2 * i; j <= n; j += i) { mark[j] = true; } } } int count = 0; for (int i = m; i <= n; i++) { if (!mark[i]) count++; } return count; } }