首页 > 试题广场 >

求素数

[编程题]求素数
  • 热度指数:2203 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
输入M、N,1 < M < N < 1000000,求区间[M,N]内的所有素数的个数。素数定义:除了1以外,只能被1和自己整除的自然数称为素数

输入描述:
两个整数M,N


输出描述:
区间内素数的个数
示例1

输入

2 10

输出

4
//通过时间:8ms  占用内存:1400kb
#include<iostream>
#define K 1000001
using namespace std;
char p[K+1] = {1,1,0};
int main() {
    int i,j;
    for(i = 2; i <= K/10; ++i)
        if(!p[i])
            for(j = 2; i*j <=K ; ++j)
                p[i*j] = 1;
    int M,N,count;
    cin>>M;
    cin>>N;
    count=0;
    for(i=M; i<=N; i++)
        if(!p[i])
            count++;
    cout<<count;
}

编辑于 2017-09-12 14:38:10 回复(0)
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> isp;
int a[1000001],l,r,m,n;
void init(){
    a[0]=a[1]=1;
    for(int i=2;i<=1000000;i++)
        if(!a[i]){
            for(int j=2*i;j<=1000000;j+=i) a[j]=1;
            isp.push_back(i);
        }
}
int main(){
    init();
    while(scanf("%d%d",&m,&n)!=EOF){
        l=lower_bound(isp.begin(),isp.end(),m)-isp.begin();
        r=upper_bound(isp.begin(),isp.end(),n)-isp.begin();
        printf("%d\n",r-l);
    }
}

发表于 2017-11-09 21:03:48 回复(0)
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
    private static int calPrimeNumber(int begin,int end){
        boolean[] prime=new boolean[end+1];
        for(int i=begin;i<prime.length;i++){
            if(i%2 == 0){
                prime[i]=false;
            }else{
                prime[i]=true;
            }
        }
        for(int i=3;i<=Math.sqrt(1.00*end);i+=2){
            for(int j=i+i;j<=end;j+=i){
                prime[j]=false;
            }
        }
        prime[2]=true;

        int count=0;
        for(int i=begin;i<=end;i++){
            if(prime[i]){
                count++;
            }
        }
        return  count;
    }
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int m=in.nextInt();
        int n=in.nextInt();
        int sum=calPrimeNumber(m,n);
        System.out.println(sum);
    }
}

编辑于 2017-09-26 21:49:49 回复(0)
//语言:C++  运行时间:14 ms 占用内存:4976K
//筛法求N以内的素数
//原理:www.cnblogs.com/xiaoxi666/p/7172440.html #include <iostream>
#include <cmath>
#include <vector>
using namespace std;
///寻找N以内的质数的个数
size_t find_Prime(int N)
{
    if(1==N)
        return 0;
 
    vector<int> prime_tmp(N,1);
    for(int i=0; 2*i+3<=sqrt(N); i++)
    {
        if(prime_tmp[i])
            for(int j=(2*i+3)+i; j<N; j+=(2*i+3))
                prime_tmp[j]=0;
    }
    vector<int> prime;//新开了一个,用来保存素数
    prime.push_back(2);
    for(int i=0; i<N; i++)
    {
        if(prime_tmp[i] && 2*i+3<=N)//说明是质数,按照质数的方法处理
        {
            prime.push_back(2*i+3);
        }
    }
 
    return prime.size();//prime保存了小于等于N的素数
}
 
int main()
{
    int M,N;
    while(cin>>M>>N){
        cout<<find_Prime(N)-find_Prime(M-1)<<endl;
    }
    return 0;
}

发表于 2017-08-09 11:09:33 回复(0)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdbool.h>

#define sc scanf
#define pr printf
#define N 999999
bool sushu[N];
 void test() {
		for (int i = 0; i <N; i++) {
			sushu[i] = 1;    //假设全部为素数
		}
		sushu[0] = sushu[1] = 0;
		for (int i = 2; i < N; i++) {
			if (sushu[i]) {
				for (int j = i + i; j <N; j += i) {
					sushu[j] = 0;
				}
			}
		}
}
int a, b;
int main() {
	test();
	int flag = 0;
	sc("%d %d", &a, &b);
	
   for (int i = a; i <b; i++) {
	   if (sushu[i]) {
		   flag++;
	   }
}
		pr("%d", flag);
		return 0;
}

发表于 2022-11-01 18:49:04 回复(0)
LeetCode 204题.计数质数的翻版。厄拉多塞筛选法为较优解
#include<iostream>
#include<vector>
using namespace std;
int main(){
    int n,m;
    cin>>n,cin>>m;
    int ret=0;
    vector<bool> bools(m-n+1);
    for(;n<=m;n++){
        if(!bools[n]){
            ret++;
            for(int j=2*n;j<=m;j+=n) bools[j]=true;
        }
    }
    cout<<ret;
}


发表于 2019-08-22 02:43:55 回复(0)
一行python代码就可以解决了
print(len([str(item) for item in filter(lambda x: not [x % i for i in range(2, x) if x % i == 0], range(a, b))]))
发表于 2018-04-13 19:54:46 回复(0)
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <cstring>
#include <math.h>

using namespace std;

int is_sure(int n)
{
	int tmp = (int)sqrt(n);
	for (int i = 2; i <= tmp; i++)
		if (n%i == 0)	return 0;
	return 1;
}

int main(int argc, char **argv)
{
	int l, r;
	while (cin >> l >> r)
	{
		int cnt = 0;
		for (int i = l; i <= r; i++)
			is_sure(i) && ++cnt;
		cout << "" << cnt << endl;
	}

	return 0;
}


发表于 2017-09-11 10:54:32 回复(0)
public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int m = scanner.nextInt();
        int n = scanner.nextInt();
        scanner.close();

        int sum = 0;
        int temp = 2;
        boolean flag = false;
        for (int i = m; i <= n; ++i)
        {
            if (i == 2){
                sum += 1;
                continue;
            }
            if (i % 2 == 0)
                continue;
            while (temp <= Math.sqrt(i)){
                if (i % temp == 0)
                {
                    flag = true;
                    break;
                }
                ++temp;
            }

            if (flag){
                flag = false;
                temp = 2;
                continue;
            }
            temp = 2;
            sum += 1;
        }
        System.out.println(sum);
    }
}

发表于 2017-08-28 21:35:23 回复(0)
h = 0
leap = 1
from math import sqrt
from sys import stdout
lower = int(input("输入区间最小值: "))
upper = int(input("输入区间最大值: "))
for m in range(lower,upper+1):
    k = int(sqrt(m + 1))
    for i in range(2,k + 1):
        if m % i == 0:
            leap = 0
            break
    if leap == 1:
       # print '%-4d' % m
        h += 1
        #if h % 10 == 0:
         #   print ''
    leap = 1
print '%d' % h 

发表于 2017-08-14 19:46:46 回复(0)
#include <iostream>
#include <stdlib.h>
#include <math.h>
using namespace std;

int FindPrime(int n)
{
	if (n < 3)
		return 0;

	bool *prime = new bool[n];
	for (int i = 0; i < n; ++i)
		i % 2 == 0 ? prime[i] = false : prime[i] = true;
	for (int i = 3; i < sqrt(n); ++i)
	{
		if (prime[i] == true)
		{
			for (int k = 2 * i; k < n; k += i)
				prime[k] = false;
		}
	}

	int cnt = 0;
	for (int i = 0; i < n; ++i)
	{
		if (prime[i] == true)
			++cnt;
	}
	return cnt;
}

int main()
{
	int m, n;
	while (cin >> m >> n)
	{
		cout << FindPrime(n) - FindPrime(m) << endl;
	}
}
缺陷:只能求m到n之间的素数个数,怎么改成打印出m到n之间的素数?
发表于 2017-08-09 17:35:55 回复(0)
运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。无法通过啊。。
编辑于 2017-08-06 22:44:25 回复(0)
public class prime {
	public static void main(String[] args) {
		//判断区间内有几个素数
		countPrime();
	}
	private static void countPrime(){
		Scanner sc = new Scanner(System.in);
		int start = sc.nextInt();
		int end = sc.nextInt();	
		int count = 0;
		for (int i = start; i <= end; i++) {
			if (i != 1) {
				int flag = 0;
				for (int j = 2; j < i; j++) {
					if (i % j == 0) {
						flag = 1;
						break;
					}
				}
			if (flag == 0){
				count++;
			}	
		}
	}	
	System.out.println(count);
  }
}

发表于 2017-08-04 17:02:39 回复(1)
通过查表的方式:
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
intmain()
{
    constlonglonglength = 1000001;
    vector<int> data(length, 1);
    for(inti = 2; i < sqrt(length); i++)
    {
        if(data[i] == 1)
        {
            for(intj = i+i; j < length; j+=i)
                data[j] = 0;       
        }
    }
    intm, n;
    while(cin >> m >> n)
    {
        intsum = 0;
        for(inti = m; i <= n; i++)
            if(data[i] == 1)
                sum++;
        cout << sum << endl;
    }
    return0;
}

编辑于 2017-08-04 12:54:25 回复(0)
import java.util.Scanner;
public class Main {
              public static void main(String []args){
                  Scanner sc=new Scanner(System.in);
                  int m=sc.nextInt();
                  int n=sc.nextInt();
                  int count=0;
                  if(m>2){
                      count=0;//若区间为起始值大于2,则质数不包括2
                  }else {
                    count=1;//若区间起始值包括2,则count为1,因为在下面的算法中,把所有偶数都置为false了
                }
                 boolean book[]=new boolean[n+1];
                 for(int i=m;i<=n;i++){
                        if(i%2==0){  //若为偶数
                                 book[i]=false;                            
                        }else {//若为奇数
                            book[i]=true;
                        }
                 }
               for(int i=3;i<=Math.sqrt(n);i+=2){                           
                               if(book[i]){
                                    for(int j=i+i;j<=n;j+=i){//3,5,7,9....的倍数置为false
                                          book[j]=false;
                                    }
                               }
               }  
               for(int i=m;i<=n;i++){
                        if(book[i]){
                            count++;
                        }
                   
               }
                    System.out.println(count);
                 }
               
           
}
发表于 2017-08-04 11:10:33 回复(0)
#include<iostream>
#include<math.h>
using namespace std;
 
intmain()
{
    intm,n;
    cin>>m;
    cin>>n;
    intk=0;
    for(inti=m;i<=n;i++)
    {   for(intj=2;j<=sqrt(i);j++)
            {if(i%j==0)
                {k++;
                break;
                }
            }
    }
    cout<<n-m+1-k<<endl;   
    return0;
 
}

发表于 2017-08-03 19:02:10 回复(4)