leetcode 204题求素数个数

   

Description:

Count the number of prime numbers less than a non-negative number, n

提示晒数法:

http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

https://primes.utm.edu/howmany.html

别人的代码:

int countPrimes(int n) {
    if (n<=2) return 0;
    vector<bool> passed(n, false);
    int sum = 1;
    int upper = sqrt(n);
    for (int i=3; i<n; i+=2) {
        if (!passed[i]) {
            sum++;
            //avoid overflow
            if (i>upper) continue;
            for (int j=i*i; j<n; j+=i) {
                passed[j] = true;
            }
        }
    }
    return sum;
}

我的代码:

// countprime.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <iostream>
#include <math.h>
#include<vector>
using namespace std;

int countPrimes1(int n)
{
	int temp = 0;
	if (2 >= n) return 0;

	bool* primes = new bool[n];
	for (int i = 2; i < n; ++i)
		primes[i] = true;

	int sqr = (int)(sqrt((double)(n - 1)));
	for (int i = 2; i <= sqr; ++i)
	{
		if (primes[i])
		{
			temp++;
			for (int j = i * i; j < n; j += i)
				primes[j] = false;
		}
	}

	int sum = 0;
	for (int i = 2; i < n; ++i)
		sum += (primes[i]) ? 1 : 0;

	/*cout<<temp;*/
	delete[] primes;

	return sum;
}

int countPrimes(int n)
{
	if (n<=2)return 0;

	int sum = 0;
	int sqr = (int)(sqrt((double)(n - 1)));

	vector<bool> prime(n,0);

	for(int i = 2; i < n; ++i)
		prime[i] = 1;

	for(int i =2; i <= sqr; ++i)
	{
		if(prime[i]==1)
		{
			//sum++;
			for(int j = i*i; j < n; j = j+i)
				prime[j] = 0;
		}

	}

	for(int i = 2;i < n; ++i)
		sum += prime[i] ? 1 : 0;

	return sum;
}

int _tmain(int argc, _TCHAR* argv[])
{

	cout<<countPrimes(5)<<endl;

	cout<<countPrimes1(3)<<endl;

	getchar();
	return 0;
}

超时代码:

int countPrimes(int n)
    {
        int sum = 0;
        for(int i = 0 ;i<=n;i=i+2)
        {
            int j = 2;
            int temp = sqrt(i);
            for(;j<=temp;j=j+1)
            {
                if((i%temp)==0)
                {break;}
                sum++;
            }
        }

        return sum;
    }

纪念一下首次AC

时间: 2024-07-30 10:18:20

leetcode 204题求素数个数的相关文章

LeetCode Count Primes 求素数个数

题意:给一个数n,返回小于n的素数个数. 思路: 1 class Solution { 2 public: 3 int countPrimes(int n) { 4 bool* isPrime =new bool[n] ; 5 6 memset(isPrime,1,n); 7 8 for(int i=2; i*i<n; i++) 9 { 10 if(!isPrime[i]) continue; 11 for(int j=i*i; j<n; j+=i) isPrime[j]=0; 12 } 13

欧拉筛法求素数个数

判断a是否为素数,求1——n的素数个数 考虑欧拉筛法———— http://wenku.baidu.com/link?url=dFs00TAw8_k46aeSbXy5nB5LVqJ51uUJgY9zVWEDQdwjLN-qLFWZuYcGPE5EDcztNQAMtKfUbSseBvfBzV4fcQvlneOVHJJQvgJjcGC1iN7 //判断是否为素数:计算1到n的素数个数 #include<iostream> #include<cstring> #define MAX 10

[刷题] 求素数

1.求出2-10000内的所有素数 Python: t = time() p_list = [] for i in range(2, b): flag = True for p in p_list: if p > math.sqrt(i): break if i % p == 0: flag = False break if flag: p_list.append(i) print(time() - t) print(p_list) 把素数判断部分封装为函数: def is_prime3(x):

How many prime numbers(求素数个数)

How many prime numbers Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 14684    Accepted Submission(s): 5091 Problem Description Give you a lot of positive integers, just to find out how many p

AtCoder Beginner Contest 142【D题】【判断素数的模板+求一个数的因子的模板】

D - Disjoint Set of Common Divisors Problem Statement Given are positive integers AA and BB. Let us choose some number of positive common divisors of AA and BB. Here, any two of the chosen divisors must be coprime. At most, how many divisors can we c

leetcode 204. Count Primes 找出素数的个数 ---------- java

Description: Count the number of prime numbers less than a non-negative number, n. 找出小于n的素数个数. 1.用最淳朴的算法果然超时了. public class Solution { public int countPrimes(int n) { if (n < 2){ return 0; } int result = 0; for (int i = 2; i < n; i++){ if (isPrimes(

LeetCode 第 204 题 (Count Primes)

LeetCode 第 204 题 (Count Primes) Description: Count the number of prime numbers less than a non-negative number, n. 计算小于 N 的素数的个数.这道题目比较简单.但是想提高计算效率与需要费点脑筋. 判断一个数字 n 是不是素数的简单方法是 用 n 去除 2,3,4,-,n?1,如果都不能整除就说明这个数是素数. 按照这个思路可以写个简单的函数. bool isPrime(int n)

蓝桥杯 算法训练 Torry的困惑(基本型)(水题,筛法求素数)

算法训练 Torry的困惑(基本型) 时间限制:1.0s   内存限制:512.0MB 问题描述 Torry从小喜爱数学.一天,老师告诉他,像2.3.5.7--这样的数叫做质数.Torry突然想到一个问题,前10.100.1000.10000--个质数的乘积是多少呢?他把这个问题告诉老师.老师愣住了,一时回答不出来.于是Torry求助于会编程的你,请你算出前n个质数的乘积.不过,考虑到你才接触编程不久,Torry只要你算出这个数模上50000的值. 输入格式 仅包含一个正整数n,其中n<=100

hdu2136Largest prime factor (关建在求素数,有点意思的题)

Problem Description Everybody knows any number can be combined by the prime number. Now, your task is telling me what position of the largest prime factor. The position of prime 2 is 1, prime 3 is 2, and prime 5 is 3, etc. Specially, LPF(1) = 0. Inpu