85.Count Primes
2016-01-24 22:19
211 查看
Count the number of prime numbers less than a non-negative number, n.
分析:题目的要求是求小于n的素数个数。素数的定义:大于等于2且只能被1和其本身除尽的整数。
思路:初始化一个长度为n的布尔型数组。a[i]为true表示i不是素数,为false表示i是素数。所以最后统计a[2...n]中false元素的个数即可。
依次排除2的2以上的倍数,3的3以上倍数,5的5以上倍数,7的7以上倍数等各个素数的倍数。4和6等合数在前面排除2或3的倍数的时候已经被排除过了。 从i*i开始排除的原因是,i*(i-m)在前面排除i-m的倍数的时候已经计算过了。比如排除5的倍数的时候,从5*5开始就好了,不用排除5倍之前,如5*3在前面3*5的时候已经排除过了。
在leetcode上提交通过的代码。
分析:题目的要求是求小于n的素数个数。素数的定义:大于等于2且只能被1和其本身除尽的整数。
思路:初始化一个长度为n的布尔型数组。a[i]为true表示i不是素数,为false表示i是素数。所以最后统计a[2...n]中false元素的个数即可。
依次排除2的2以上的倍数,3的3以上倍数,5的5以上倍数,7的7以上倍数等各个素数的倍数。4和6等合数在前面排除2或3的倍数的时候已经被排除过了。 从i*i开始排除的原因是,i*(i-m)在前面排除i-m的倍数的时候已经计算过了。比如排除5的倍数的时候,从5*5开始就好了,不用排除5倍之前,如5*3在前面3*5的时候已经排除过了。
在leetcode上提交通过的代码。
/** * 提交通过! * 思路:初始化一个长度为n的布尔型数组。a[i]为true表示i不是素数,为false表示i是素数。所以最后统计a[2...n]中false元素的个数即可。 * 依次排除2的2以上的倍数,3的3以上倍数,5的5以上倍数,7的7以上倍数等各个素数的倍数。4和6等合数在前面排除2或3的倍数的时候已经被排除过了。 * 从i*i开始排除的原因是,i*(i-m)在前面排除i-m的倍数的时候已经计算过了。 * 比如排除5的倍数的时候,从5*5开始就好了,不用排除5倍之前,如5*3在前面3*5的时候已经排除过了。 */ public int countPrimes3(int n) { int totalNum = 0; if(n<=2){/*2是最小的素数,比2小的素数个数是0.*/ return 0; } /*初始化一个长度为n的布尔型数组。a[i]为true表示i不是素数,为false表示i是素数。所以最后统计a[2...n]中false元素的个数即可。*/ boolean a[] = new boolean ; for(int i = 2;i*i<n;i++){ if(!a[i]){/*依次排除2的2以上的倍数,3的3以上倍数,5的5以上倍数,7的7以上倍数等各个素数的倍数。4和6等合数在前面排除2或3的倍数的时候已经被排除过了*/ for(int j =i;i*j<n;j++){/*从i*i开始计算的原因是,i*(i-m)在前面排除i-m的倍数的时候已经计算过了*/ a[i*j]=true; } } } /*后统计a[2...n]中false元素的个数.*/ for(int i = 2;i<n;i++){ if(a[i]==false){ totalNum++; } } return totalNum; }提交不通过的代码,逻辑对,但是提示运行超时。
/** * 提交不通过,运行超时! * 给定正整数,求小于n的素数的个数。 素数的定义:大于等于2且只能被1和其本身除尽的整数。 * 2是最小的素数,比2小的素数个数是0. * 除了2以外偶数肯定不是素数,所以只需要判断奇数即可。 * 虽然已经尽量减少去判断素数的次数了,但是提交的时候还是超时。 */ public int countPrimes(int n) { int totalNum = 0; if(n<=2){/*2是最小的素数,比2小的素数个数是0.*/ return 0; } totalNum++;//走到这一步说明2算一个小于n的素数。 /*除了2以外偶数肯定不是素数,所以只需要判断奇数即可*/ for(int i=3;i<n;i=i+2){ if(isPrime(i)){ totalNum++; } } return totalNum; } /** * 判断 一个整数是否为素数 */ public boolean isPrime(int a) { boolean flag = true; /*因为在上面我控制了传进来的a不可能是偶数,所以可以开始从3除*/ for (int i = 3; i <= Math.sqrt(a); i++) { if (a % i == 0) {// 若能被整除,则说明不是素数,返回false flag = false; break;// 跳出循环 } } return flag; } /** * 提交不通过,运行超时! * 虽然已经尽量减少去判断素数的次数了,但是提交的时候还是超时。 */ public int countPrimes2(int n) { int totalNum = 0; if(n<=2){/**/ return 0; } totalNum++;//走到这一步说明2算一个小于n的素数。 /*除了2以外偶数肯定不是素数,所以只需要判断奇数即可*/ for(int i=3;i<n;i=i+2){ boolean flag = true; /*因为在上面我控制了传进来的a不可能是偶数,所以可以开始从3除*/ for (int j = 3; j <= Math.sqrt(i); j++) { if (i % j == 0) {// 若能被整除,则说明不是素数,返回false flag = false; break;// 跳出循环 } } if(flag){ totalNum++; } } return totalNum; }
相关文章推荐
- restlet Framework2.2和2.3版本的对比
- 大型网站架构系列:消息队列(二)
- IOS实战之项目架构
- 名词解释之人身保险概论
- 类分多文件开发
- 有个段子手一样的亲妈,是你的福气!
- 事务管理配置
- woj1152 静态维护第K大
- 沙盒存储
- 2016第3周日
- 「C语言」「概念」常量和变量的表示及应用
- 使用 Maven 部署 artifact 到 Nexus 教程
- CSDN博客简介
- HDU 2601:An easy problem【数学】
- 2016-01-24
- Entity Framework 6 Recipes 2nd Edition(11-2)译 -> 为一个”模型定义”函数返回一个计算列
- @property与@synthesize的区别
- 背面剔除(backface culling)
- JPA 对象关系映射总结(一)---persistence.xml 文件配置要点
- vim树状目录插件NERDTree安装