NEFU 117

题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=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

题解:

这道题目可以说是比较有趣的数学题,相比于算法,考得更多的应该是数学上的内容吧。

因为不可能真的去遍历1到10^n一个一个判断是否为素数,然后求出个数,在求位数,显然TLE,所以换其他思路;

首先,根据素数定理,可知π(x) ≈ n / ln(n),向本题中,问的是位数,那用约等于问题就不大,两者相差没到10倍就可以说位数上是一样的;

故根据题意,就有:

那么,如何求这个数的位数呢,也很简单用log(10,x)+1即可:

AC代码:

 1 #include<cstdio>
 2 #include<cmath>
 3 int n;
 4 int main()
 5 {
 6     while(scanf("%d",&n)!=EOF)
 7     {
 8         double ans=n-log10(n*log(10))+1;
 9         printf("%d
",int(ans));
10     }
11 }
原文地址:https://www.cnblogs.com/dilthey/p/7536800.html