204.计数质数

感觉挺简单的 结果掉坑了 超时警告

class Solution {
    public int countPrimes(int n) {
            int temp = 0;
            for(int i = 0 ;i < n ;i++){
                if(isPrimeNumber(i)){
                    temp++;
                }
            }
            return temp;
        }
       public  boolean isPrimeNumber(int n) {
            if(n == 1||n == 0)
                return false;
           if(n==2||n==3) {
                return true;
            }
            for(int i = 2; i < n;i++) {
                if(n % i == 0) {
                    return false;
                }
            }
            return true;
        }
}

进行修改
将总数除以n/2 emmm 又报错。。。。。。。。好吧 想不出 瞄了一眼答案
第二种解法是
厄拉多塞筛法:?
简单介绍一下厄拉多塞筛法。厄拉多塞是一位古希腊数学家,他在寻找素数时,采用了一种与众不同的方法:先将2-N的各数放入表中,然后在2的上面画一个圆圈,然后划去2的其他倍数;第一个既未画圈又没有被划去的数是3,将它画圈,再划去3的其他倍数;现在既未画圈又没有被划去的第一个数 是5,将它画圈,并划去5的其他倍数……依次类推,一直到所有小于或等于N的各数都画了圈或划去为止。这时,表中画了圈的以及未划去的那些数正好就是小于 N的素数。
这很像一面筛子,把满足条件的数留下来,把不满足条件的数筛掉。由于这种方法是厄拉多塞首先发明的,所以,后人就把这种方法称作厄拉多塞筛法。
在计算机中,筛法可以用给数组单元置零的方法来实现。具体来说就是:首先开一个数组:a[i],i=1,2,3,…,同时,令所有的数组元素都等于下标 值,即a[i]=i,当i不是素数时,令a[i]=0 。当输出结果时,只要判断a[i]是否等于零即可,如果a[i]=0,则令i=i+1,检查下一个a[i]。
筛法是计算机程序设计中常用的算法之一。

 public int countPrimes(int n) {
         int sum = 0;
         int[]arr = new int [n];
         for(int i = 2 ;i < n ;i++) { //n改为Math.sqrt(n) 更快一点
             int j = 2;
                if(arr[i]!=1)
             while(j * i < n ) {
                 arr[j * i ] = 1;
                 j++;
             }
         }
         for(int i = 2 ;i< n ;i++) {
             if(arr[i] != 1) {
                 sum++;
             }
         }
                 return sum;
     }
class Solution {
 public int countPrimes(int n) {
   boolean[] isPrime = new boolean[n];
   for (int i = 2; i < n; i++) {
      isPrime[i] = true;
   }
   // Loop's ending condition is i * i < n instead of i < sqrt(n)
   // to avoid repeatedly calling an expensive function sqrt().
   for (int i = 2; i * i < n; i++) {
      if (!isPrime[i]) continue;
      for (int j = i * i; j < n; j += i) {
         isPrime[j] = false;
      }
   }
   int count = 0;
   for (int i = 2; i < n; i++) {
      if (isPrime[i]) count++;
   }
   return count;
}
}
public class Solution {
    public int countPrimes(int n) {
        int res = 0;
        boolean[] used = new boolean[n];//这个解法跟我差不多 就是改为boolean 花的时间更少
        for (int i = 2; i <= Math.sqrt(n); i++) {
         if (!used[i - 1]) {
            int temp = i * i;
            while (temp < n) {
                used[temp - 1] = true;
                temp += i;
            }
        }
        }
        for (int i = 2; i < n; i++) {
        if (!used[i - 1]) {
            res++;
        }
        }
        return res;
    }
}

原文地址:https://www.cnblogs.com/cznczai/p/11150452.html

时间: 2024-08-12 16:08:58

204.计数质数的相关文章

204. 计数质数 | Count Primes

Count the number of prime numbers less than a non-negative number, n. Example: Input: 10 Output: 4 Explanation: There are 4 prime numbers less than 10, they are 2, 3, 5, 7. 统计所有小于非负整数 n 的质数的数量. 示例: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 .

[LeetCode] 204. 计数质数

题目链接:https://leetcode-cn.com/problems/count-primes/ 题目描述: 统计所有小于非负整数 n 的质数的数量. 示例: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 . 思路: 质数就是除了 1 和本身找不到其他能除尽的数,思路请看题目的提示! 思路一:暴力法(超时)(大家可以学习一下 for ... else 的用法, 一般配合 break 使用) class Solution: def cou

204计数质数

题目:统计所有小于非负整数 n 的质数的数量. 来源:https://leetcode-cn.com/problems/count-primes/ 法一:自己的超时代码 思路:和官方的方法事实上一样,但是代码没有用标记0 1的方法,导致很费时.删除每个质数的倍数时,都需要判断是否存在,如果是用标记0 1的方法不会出现这种问题,要学会这个切片技巧. import math class Solution: def countPrimes(self, n: int) -> int: if n in [

【leetcode 简单】 第五十八题 计数质数

统计所有小于非负整数 n 的质数的数量. 示例: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 . class Solution: def countPrimes(self, n): """ :type n: int :rtype: int """ isPrime = [1] * max(2, n) isPrime[0],isPrime[1]=False,False x = 2 while x

LeetCode. 计数质数

题目要求: 统计所有小于非负整数 n 的质数的数量. 示例i: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 . 代码: class Solution { public: int countPrimes(int n) { if (n <= 2) return 0; vector<bool> prime(n, true); for(int i = 2; i*i < n; i++) { if(prime[i]) { for(int

leet

# 题名1 两数之和    2 两数相加    3 无重复字符的最长子串    4 寻找两个有序数组的中位数    5 最长回文子串    6 Z 字形变换    7 整数反转    8 字符串转换整数 (atoi)    9 回文数    10 正则表达式匹配    11 盛最多水的容器    12 整数转罗马数字    13 罗马数字转整数    14 最长公共前缀    15 三数之和    16 最接近的三数之和    17 电话号码的字母组合    18 四数之和    19 删除链表

leetcode实战—素数(埃拉托色尼筛选法包括证明、哈希、RSA)

前言 素数这个概念人类已经研究了上千年,但是的具体的起源却不得而知.早在公元前300年,欧几里得就在他的著作元素中证明了有无穷多个素数,同时也证明了任何一个整数都能够被某一个素数整除.时至今日,素数在计算机科学这样一个和数学联系紧密的学科中也有这个广泛的应用,比如布隆过滤器.伪随机数.RSA加密算法等等,所以掌握素数的特性以及应用能够帮助我们解决不少实际问题. 简介 素数(又称质数)是一个只能被1和它自己整除的整数,换句话说他只有两个因数--1和它自己.比如3是一个素数,因为3只能被1和3整除,

LeetCode 204 Count Primes(质数计数)(*)

翻译 计算小于一个非负整数n的质数的个数. 原文 Count the number of prime numbers less than a non-negative number, n. 分析 这道题以前遇到过,当时是用的最笨的办法,现在也没什么好想法,又恰好题目有提示,我就点开了.题目的提示是一条一条给出来的,我也就逐个的全点开了,感觉好失败-- public int countPrimes(int n) { int count = 0; for (int i = 1; i < n; i++

LeetCode OJ:Count Primes(质数计数)

Count the number of prime numbers less than a non-negative number, n. 计算小于n的质数的个数,当然就要用到大名鼎鼎的筛法了,代码如下,写的有点乱不好意思. 1 class Solution { 2 public: 3 int countPrimes(int n) { 4 vector<int> vtor(n + 1, 0); 5 vector<int> ret; 6 for (int i = 0; i <=