Description:

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

分析:

思路首先:一个数不是合数就是素数,合数更好推断呢!

合数:不论什么一个合数都能够表现为适当个素数的乘积的形式,
所以我们仅仅用小于sqrt(number)的素数去除要推断的数就可以,
由于合数在sqrt(number)以内一定有素数的质因子
比方要推断100以内的素数,仅仅需推断合数就可以。仅仅用10以内的2,3。5。7就够了,10000以内的数用100以内的素数推断足以。执行时间O(N)

class Solution {
public: int countPrimes(int n) {
if(n<=2)
return 0; basenum.reserve(10001);//预留空间
basenum.push_back(2); int cnt=1;
for (int number=3; number < n; number++)//计算出n以内的素数个数
{
int flag = true;
int tmp = static_cast<int>(sqrt(number));
//推断是否是素数
int j = 0;
while (basenum[j] <= tmp)
{
if (number % basenum[j] == 0)
{ //此时合数
flag = false;
break;
}
j++;
}
if (flag)
{
basenum.push_back(number);
cnt++;
}
}
return cnt;
}
private:
vector<int> basenum;//用于存储素数
};

这个问题是上海交通大学2008年的研究生面试题:

Prime Number

题目描写叙述:

Output the k-th prime number.

输入:

k≤10000

输出:

The k-th prime number.

例子输入:
3
7
例子输出:
5
17

我的答案:

#include "vector"
#include <iostream>
#include "fstream"
#include "algorithm"
#include <stdio.h>
#include "string"
#include <cmath>
#include <cstdlib>
#include "map" using namespace std; vector<int> basenum;//用于存储素数
//素数推断法:不论什么一个合数都能够表现为适当个素数的乘积的形式,
//所以我们仅仅用小于sqrt(number)的素数去除要推断的数number就可以,
//比方要推断100以内的素数。仅仅用10以内的2,3,5,7就够了,10000以内的数用100以内的素数推断足以。 void initPrime()
{
basenum.reserve(10001);//预留空间
basenum.push_back(2);
basenum.push_back(3);
basenum.push_back(5);
basenum.push_back(7);//先压入4个素数
int number=11; for (int i = 5; i <= 10000; number++)//计算出10000个素数
{
int flag = true;
int tmp = static_cast<int>(sqrt(number));
//推断是否是素数
int j = 0;
while (basenum[j] <= tmp)
{
if (number % basenum[j] == 0)
{ //此时合数
flag = false;
break;
}
j++;
}
if (flag)
{
basenum.push_back(number);
i++;
}
}
} int main()
{
int n;
initPrime();
while (cin>>n)
printf("%d\n", basenum[n - 1]);
return 0;
}
/**************************************************************
Problem: 1040
User: EbowTang
Language: C++
Result: Accepted
Time:10 ms
Memory:1536 kb
****************************************************************/

以前写过的最糟糕的素数推断方法:

//思路首先:
//最朴素(糟糕)的方法
class Solution {
public:
bool IsPrimeNum(int num)
{
if (num <= 1)
return false;
for (int i = 2; i <= num/2; i++)
{
if (num % i == 0)//一旦能够整除立刻返回他不是素数
return false;
}
return true;
}
int countPrimes(int n) {
int cnt=0;
int curNum=1;
while(curNum<=n)
{
if(IsPrimeNum(curNum))
cnt++;
curNum++;
}
return cnt;
}
};

小结:遇到存在对立角度的问题,能够考虑用还有一面来破解,而不拘泥于正面破解。

以后素数问题都直接推断合数问题就可以。

注:本博文为EbowTang原创,兴许可能继续更新本文。

假设转载,请务必复制本条信息!

原文地址:http://blog.csdn.net/ebowtang/article/details/50469592

原作者博客:http://blog.csdn.net/ebowtang

&lt;LeetCode OJ&gt; 204. Count Primes的更多相关文章

  1. 【leetcode❤python】 204. Count Primes

    #-*- coding: UTF-8 -*- #Hint1:#数字i,i的倍数一定不是质数,因此去掉i的倍数,例如5,5*1,5*2,5*3,5*4,5*5都不是质数,应该去掉#5*1,5*2,5*3 ...

  2. [leetcode] 204. Count Primes 统计小于非负整数n的素数的个数

    题目大意 https://leetcode.com/problems/count-primes/description/ 204. Count Primes Count the number of p ...

  3. leetcode 263. Ugly Number 、264. Ugly Number II 、313. Super Ugly Number 、204. Count Primes

    263. Ugly Number 注意:1.小于等于0都不属于丑数 2.while循环的判断不是num >= 0, 而是能被2 .3.5整除,即能被整除才去除这些数 class Solution ...

  4. 204. Count Primes - LeetCode

    Queston 204. Count Primes Solution 题目大意:给一个数,求小于这个数的素数的个数 思路:初始化一个boolean数组,初始设置为true,先遍历将2的倍数设置为fal ...

  5. 【刷题-LeetCode】204. Count Primes

    Count Primes Count the number of prime numbers less than a non-negative number, *n*. Example: Input: ...

  6. [LeetCode] 204. Count Primes 质数的个数

    Count the number of prime numbers less than a non-negative number, n. Example: Input: 10 Output: 4 E ...

  7. [LeetCode] 204. Count Primes 计数质数

    Description: Count the number of prime numbers less than a non-negative number, n click to show more ...

  8. 【LeetCode】204 - Count Primes

    Description:Count the number of prime numbers less than a non-negative number, n. Hint: Let's start ...

  9. Java [Leetcode 204]Count Primes

    题目描述: Description: Count the number of prime numbers less than a non-negative number, n. 解题思路: Let's ...

随机推荐

  1. JavaScript日期时间格式化函数

    这篇文章主要介绍了JavaScript日期时间格式化函数分享,需要的朋友可以参考下 这个函数经常用到,分享给大家. 函数代码: //格式化参数说明: //y:年,M:月,d:日,h:时,m分,s:秒, ...

  2. Leetcode36--->Valid Sudoku(判断给定的数独是否有效)

    题目:给定一个数独,某些部分已经被填上了数字,其余空的地方用‘.’表示:判断给定的数独是否有效: 数独规则: 每一行不能有重复的数字:每一列不能有重复的数字:将数独框划分为三行三列,没9个小方格不能有 ...

  3. python-网络编程-03

    首先我们可以看下可以最简单的交互性的服务端和客户端程序 server import socket def main(): sock = socket.socket(socket.AF_INET,soc ...

  4. Python爬虫selenium、PhanmJs

    selenium:可以模拟鼠标进行一些操作 实例1:实现自动打开google浏览器,进行百度搜索,并关闭浏览器 from selenium import webdriver from time imp ...

  5. 解决vue、cnpm造成的样式错位问题

    删除node_modules文件夹使用npm install不要使用cnpm install

  6. 九度oj 题目1513:二进制中1的个数

    题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入: 输入可能包含多个测试样例. 对于每个输入文件,第一行输入一个整数T,代表测试样例的数量.对于每个测试样例输入为一个 ...

  7. gulp前端自动化入门

    一.从零开始搭建gulp前端自动化 1.首先安装nodejs 2.npm init 初始化 生成package.json 2.1 可以选装cnpm cnpm是淘宝提供的服务 安装:命令提示符执行npm ...

  8. 学习javascript设计模式之装饰者模式

    1.装饰者模式定义:给对象动态添加职责的方式称为装饰者(decorator)模式. js如何实现装饰者模式 通过保存原函数引用方式改写某函数 window.onload = function(){al ...

  9. 共享内存之——system V共享内存

    System V 的IPC对象有共享内存.消息队列.信号灯(量). 注意:在IPC的通信模式下,不管是共享内存.消息队列还是信号灯,每个IPC的对象都有唯一的名字,称为"键(key)&quo ...

  10. wpf LookUpEdit PopupContentTemplate

    <dxg:LookUpEdit Name="searchLookUpEdit" HorizontalAlignment="Stretch" PopupHe ...