NEFU 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
							

hint

素数定理

 

数论问题,应用素数定理第一个估计即可轻松破之~~

素数定理:

对正实数x,定义π(x)为不大于x的素数个数。数学家找到了一些函数来估计π(x)的增长。以下是第一个这样的估计。

\pi(x)\approx\frac{x}{\ln\,x}

其中ln x为x的自然对数。上式的意思是当x趋近∞,π(x)与x/ln x的比值趋近1。但这不表示它们的数值随着x增大而接近。

下面是对π(x)更好的估计:

\pi(x)={\rm Li} (x) + O \left(x e^{-\frac{1}{15}\sqrt{\ln\,x}}\right),当x 趋近∞。

其中{\rm Li} (x) = \int_2^x \frac{dt}{\ln\,t}(对数积分),而关系式右边第二项是误差估计,详见大O符号。

下表比较了π(x),x/ln x和Li(x):

xπ(x)[1]π(x) − x / ln x[2]π(x) / (x / ln x)li(x) − π(x)[3]x / π(x)
104−0.30.9212.22.500
102253.31.1515.14.000
103168231.161105.952
1041,2291431.132178.137
1059,5929061.1043810.425
10678,4986,1161.08413012.740
107664,57944,1581.07133915.047
1085,761,455332,7741.06175417.357
10950,847,5342,592,5921.0541,70119.667
1010455,052,51120,758,0291.0483,10421.975
10114,118,054,813169,923,1591.04311,58824.283
101237,607,912,0181,416,705,1931.03938,26326.590
1013346,065,536,83911,992,858,4521.034108,97128.896
10143,204,941,750,802102,838,308,6361.033314,89031.202
101529,844,570,422,669891,604,962,4521.0311,052,61933.507
1016279,238,341,033,9257,804,289,844,3931.0293,214,63235.812
10172,623,557,157,654,23368,883,734,693,2811.0277,956,58938.116
101824,739,954,287,740,860612,483,070,893,5361.02521,949,55540.420
1019234,057,667,276,344,6075,481,624,169,369,9601.02499,877,77542.725
10202,220,819,602,560,918,84049,347,193,044,659,7011.023222,744,64445.028
102121,127,269,486,018,731,928446,579,871,578,168,7071.022597,394,25447.332
1022201,467,286,689,315,906,2904,060,704,006,019,620,9941.0211,932,355,20849.636
10231,925,320,391,606,803,968,92337,083,513,766,578,631,3091.0207,250,186,21651.939

素数定理可以给出第n个素数pn)的渐近估计:

p(n)\sim n\ln\,n.

它也给出从整数中抽到素数的概率。从不大于n的自然数随机选一个,它是素数的概率大约是1/ln n

 

下面是我AC的代码

[C++]
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 
 6 using namespace std;
 7 
 8 int main()
 9 {
10     long long n;
11 
12     while(cin>>n)
13     {    
14         long long t=n;
15         char s[20];
16         t*=log(10);
17         sprintf(s,"%lld",t);
18         cout<<n-strlen(s)+1<<endl;
19     }
20 
21     return 0;
22 }

 

转载于:https://www.cnblogs.com/lzj-0218/archive/2013/05/04/3059681.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值