nefu117 - 素数个数的位数(素数定理)

Description
小明是一个聪明的孩子,对数论有着很浓烈的兴趣。
他发现求1到正整数10n 之间有多少个素数是一个很难的问题,该问题的难以决定于n 值的大小。
现在的问题是,告诉你n的值,让你帮助小明计算小于10n的素数的个数值共有多少位?
Input
输入数据有若干组,每组数据包含1个整数n(1 < n < 1000000000),若遇到EOF则处理结束。
Output
对应每组数据,将小于10n 的素数的个数值的位数在一行内输出,格式见样本输出。同组数据的输出,其每个尾数之间空一格,行末没有空格。
Sample Input
3
7
Sample Output
3
6
Hint
素数定理
题目链接
参考题解

这道题目数据量很大,所以肯定是不能直接算的,只能利用素数定理。在n越大的时候π(n) = n / ln(n)误差越小。因为是求位数,所以直接利用log10函数,lg(10n / ln(10n)) + 1就是答案,稍微整理一下就变成了n - log10(n) - log10(log(10)); log在cmath库里面是自然底数求对数。
AC代码:

#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

int main()
{
    double n, m;
    while(~scanf("%lf", &n))
    {
        m = double(n - log10(n) - log10(log(10)));
        printf("%d\n", int(m) + 1);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_40788897/article/details/82769660