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位,可得 10^x = 10^N/ln(10^N)。

对两边同时取对数log10,得:

10^x = N^10 / ln(N^10)

log10(10^x) = log10( 10^N
/ ln(10^N) )

x = N - log10( ln(10^N) )

x = N - ( log10(N) + log10( ln10 )

x = N - log10(N) - log10( ln10 )

最后x取整+1,得出对应的位数。

素数定理:

对正实数x,定义π(x)为不大于x的素数个数。当x趋近∞,π(x) 和x/ln x的比趋近1。

AC代码:

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const double e = 2.71828;

int main()
{
    int N;
    while(cin >> N)
    {
        double M = double(N) - log10(N) - log10(log(10));
        cout << (int)M + 1 << endl;
    }

    return 0;
}
时间: 2024-08-07 00:17:01

NEFU117 素数个数的位数【素数定理】的相关文章

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

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

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

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

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,这