NEFU 素数个数的位数 (素数定理)

素数个数的位数

Problem : 117

Time Limit : 1000ms

Memory Limit : 65536K

description


小明是一个聪明的孩子,对数论有着很浓烈的兴趣。

他发现求1到正整数10n 之间有多少个素数是一个很难的问题,该问题的难以决定于n 值的大小。


现在的问题是,告诉你n的值,让你帮助小明计算小于10n的素数的个数值共有多少位?


input


输入数据有若干组,每组数据包含1个整数n(1 < n < 1000000000),若遇到EOF则处理结束。

output



对应每组数据,将小于10n 的素数的个数值的位数在一行内输出,格式见样本输出。同组数据的输出,其每个尾数之间空一格,行末没有空格。


sample_input


3
7

sample_output


3
6

思路:

素数定理: π(x)表示小于正实数x的素数的个数 ,有π(x)/(x/lnx)近似=1

推论:第n个素数Pn ~ nlnn

所以位数是:lg( 10^n / ln(10^n)) +1

//Accepted 872k 3ms C++ (g++ 3.4.3) 284
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
    double n;
    while(~scanf("%lf",&n))
    {
        double c;
        c=n-log10(n)-log10(log(10));
        printf("%d\n",int(c)+1);
    }
}
时间: 2024-11-08 23:18:21

NEFU 素数个数的位数 (素数定理)的相关文章

nefu117 素数个数的位数,素数定理

素数个数的位数 Time Limit 1000ms Memory Limit 65536K description 小明是一个聪明的孩子,对数论有着很浓烈的兴趣.他发现求1到正整数10n 之间有多少个素数是一个很难的问题,该问题的难以决定于n 值的大小.现在的问题是,告诉你n的值,让你帮助小明计算小于10n的素数的个数值共有多少位? input 输入数据有若干组,每组数据包含1个整数n(1 < n < 1000000000),若遇到EOF则处理结束. output 对应每组数据,将小于10&l

NEFU117 素数个数的位数【素数定理】

题目连接: http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=117 题目大意: 给你一个整数N(1 < N < 1000000000),如果小于10^N的整数中素数的个数为π(N), 那么问题来了:求π(N)的位数是多少. 思路: 素数的个数π(N)有素数定理可得:π(N) = N/ln(N).本题中π(10^N) = 10^N/ln(10^N). 问题就转换为:求N^10*ln(N^10)共有多少位.设共有x位,可得

LeetCode Count Primes 求素数个数

题意:给一个数n,返回小于n的素数个数. 思路: 1 class Solution { 2 public: 3 int countPrimes(int n) { 4 bool* isPrime =new bool[n] ; 5 6 memset(isPrime,1,n); 7 8 for(int i=2; i*i<n; i++) 9 { 10 if(!isPrime[i]) continue; 11 for(int j=i*i; j<n; j+=i) isPrime[j]=0; 12 } 13

1439 筛法统计素数个数

1439 统计素数个数 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 青铜 Bronze 题解 题目描述 Description 输入区间[L, R],寻找在此区间内的质数. 输入描述 Input Description 开区间[L, R]中的整数L,R 输出描述 Output Description 在此区间中所有质数的个数n 样例输入 Sample Input 0 100 样例输出 Sample Output 25 数据范围及提示 Data Size & Hint 对于所有数

1453 统计素数个数 2

1453 统计素数个数 2 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description 判断[a,b]中素数的个数 输入描述 Input Description 输入共1行,a,b两数 输出描述 Output Description 输出共1行,输出素数的个数 样例输入 Sample Input 3 5 样例输出 Sample Output 2 数据范围及提示 Data Size & Hint 对于100%的数据,a,b≤5000,000

欧拉筛法求素数个数

判断a是否为素数,求1——n的素数个数 考虑欧拉筛法———— http://wenku.baidu.com/link?url=dFs00TAw8_k46aeSbXy5nB5LVqJ51uUJgY9zVWEDQdwjLN-qLFWZuYcGPE5EDcztNQAMtKfUbSseBvfBzV4fcQvlneOVHJJQvgJjcGC1iN7 //判断是否为素数:计算1到n的素数个数 #include<iostream> #include<cstring> #define MAX 10

对素数的判断和素数个数的判断

应该说这是比较高效的解题方法了吧. 素数个数计数: class Solution { public:     int countPrimes(int n) {        bool* a = new bool[n];        for(int i=2; i*i<n; i++) {           if(!a[i]) {               for(int j=i; i*j<n; j++) {                   a[i*j] = true;          

POJ 3978 Primes(求范围素数个数)

http://poj.org/problem?id=3978 题意: 给你一个区间范围A和B,要你求出[A,B]内的素数个数.其中B<=100000. 分析: 首先我们求出2到10W的素数表,把每个素数按从小到大的顺序保存在prime数组中.然后我们用二分查找找到A的下界和B的上界,然后用上界-下界即为素数个数. 程序实现用了两种筛选法来求素数表.两种筛选法都是基于每个自然合数都可以分解为:最小素因子p*剩余部分q.且q>=p. 第一种方式是基本的筛选法,效率慢些,不过也趋近于线性了. 第二种

百练3177:判决素数个数

总时间限制:  1000ms 内存限制:  65536kB 描述 输入两个整数X和Y,输出两者之间的素数个数(包括X和Y). 输入 两个整数X和Y(1 <= X,Y <= 105). 输出 输出一个整数,表示X,Y之间的素数个数(包括X和Y). 样例输入 1 100 样例输出 25 分析: 由于 1 <= X,Y <= 105 因此不能在开始时将素数都算出来,保存在数组里(因为开不了那么大的数组). 遍历X到Y,判断每一个数是否为素数,注意题目给的X和Y可能会 X > Y,这