<LeetCode OJ> 204. Count Primes
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
<LeetCode OJ> 204. Count Primes的更多相关文章
- 【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 ...
- [leetcode] 204. Count Primes 统计小于非负整数n的素数的个数
题目大意 https://leetcode.com/problems/count-primes/description/ 204. Count Primes Count the number of p ...
- 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 ...
- 204. Count Primes - LeetCode
Queston 204. Count Primes Solution 题目大意:给一个数,求小于这个数的素数的个数 思路:初始化一个boolean数组,初始设置为true,先遍历将2的倍数设置为fal ...
- 【刷题-LeetCode】204. Count Primes
Count Primes Count the number of prime numbers less than a non-negative number, *n*. Example: Input: ...
- [LeetCode] 204. Count Primes 质数的个数
Count the number of prime numbers less than a non-negative number, n. Example: Input: 10 Output: 4 E ...
- [LeetCode] 204. Count Primes 计数质数
Description: Count the number of prime numbers less than a non-negative number, n click to show more ...
- 【LeetCode】204 - Count Primes
Description:Count the number of prime numbers less than a non-negative number, n. Hint: Let's start ...
- Java [Leetcode 204]Count Primes
题目描述: Description: Count the number of prime numbers less than a non-negative number, n. 解题思路: Let's ...
随机推荐
- JavaScript日期时间格式化函数
这篇文章主要介绍了JavaScript日期时间格式化函数分享,需要的朋友可以参考下 这个函数经常用到,分享给大家. 函数代码: //格式化参数说明: //y:年,M:月,d:日,h:时,m分,s:秒, ...
- Leetcode36--->Valid Sudoku(判断给定的数独是否有效)
题目:给定一个数独,某些部分已经被填上了数字,其余空的地方用‘.’表示:判断给定的数独是否有效: 数独规则: 每一行不能有重复的数字:每一列不能有重复的数字:将数独框划分为三行三列,没9个小方格不能有 ...
- python-网络编程-03
首先我们可以看下可以最简单的交互性的服务端和客户端程序 server import socket def main(): sock = socket.socket(socket.AF_INET,soc ...
- Python爬虫selenium、PhanmJs
selenium:可以模拟鼠标进行一些操作 实例1:实现自动打开google浏览器,进行百度搜索,并关闭浏览器 from selenium import webdriver from time imp ...
- 解决vue、cnpm造成的样式错位问题
删除node_modules文件夹使用npm install不要使用cnpm install
- 九度oj 题目1513:二进制中1的个数
题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入: 输入可能包含多个测试样例. 对于每个输入文件,第一行输入一个整数T,代表测试样例的数量.对于每个测试样例输入为一个 ...
- gulp前端自动化入门
一.从零开始搭建gulp前端自动化 1.首先安装nodejs 2.npm init 初始化 生成package.json 2.1 可以选装cnpm cnpm是淘宝提供的服务 安装:命令提示符执行npm ...
- 学习javascript设计模式之装饰者模式
1.装饰者模式定义:给对象动态添加职责的方式称为装饰者(decorator)模式. js如何实现装饰者模式 通过保存原函数引用方式改写某函数 window.onload = function(){al ...
- 共享内存之——system V共享内存
System V 的IPC对象有共享内存.消息队列.信号灯(量). 注意:在IPC的通信模式下,不管是共享内存.消息队列还是信号灯,每个IPC的对象都有唯一的名字,称为"键(key)&quo ...
- wpf LookUpEdit PopupContentTemplate
<dxg:LookUpEdit Name="searchLookUpEdit" HorizontalAlignment="Stretch" PopupHe ...