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. 【Shell】使用shell打印菜单,一键安装Web应用

    问题描述: [解答] [root@A04-Test- scripts]# more menu.sh #!/bin/bash echo "1.[install lamp]" echo ...

  2. Java + golang 爬取B站up主粉丝数

    自从学习了爬虫,就想在B站爬取点什么数据,最近看到一些个up主涨粉很快,于是对up主的粉丝数量产生了好奇,所以就有了标题~ 首先,我天真的以为通过up主个人空间的地址就能爬到 https://spac ...

  3. 匈牙利算法 - Luogu 1963 变换序列

    P1963 变换序列 题目描述 对于N个整数0,1,-,N-1,一个变换序列T可以将i变成Ti,其中:Ti∈{0,1,-,N-1}且 {Ti}={0,1,-,N-1}. x,y∈{0,1,-,N-1} ...

  4. 用Python表达对Android的想法

    组员:喻航,张子东 视频:点我 #DISCARD ANDROID TODAY! import turtle import turtle as gui #setting turtle.screensiz ...

  5. C# Settings.settings的用处

    1.定义 在Settings.settings文件中定义配置字段.把作用范围定义为:User则运行时可更改,Applicatiion则运行时不可更改.可以使用数据网格视图,很方便: 2.读取配置值 t ...

  6. [转] Makefile 基础 (8) —— Makefile 隐含规则

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...

  7. 你能说出SQL聚集索引和非聚集索引的区别吗?

    最近突然想起前一阵和一朋友的聊天,当时他问我的问题是一个非常普通的问题:说说SQL聚集索引和非聚集索引的区别. AD:WOT2015 互联网运维与开发者大会 热销抢票 其实对于非专业的数据库操作人员来 ...

  8. 使用UltraEdit 替换解决---文字中含有逗号的文件,如何把逗号自动转换成为:回车换行呢?

    实际工作中有时经常遇到一个问题: 一行文字中含有逗号,如何把逗号自动转换成为:回车换行呢? 普遍存在的问题,用Ultredit中^r^n(回车换行)也可以完成.提供大家参考. 王乐,李宏宇,张志鹏,刘 ...

  9. poj 1912 A highway and the seven dwarfs

    A highway and the seven dwarfs Time Limit: 8000MS   Memory Limit: 30000K Total Submissions: 2622   A ...

  10. 【kindeditor】kindeditor的使用

    官网:http://kindeditor.net/demo.php 效果: