素数

素数/质数/prime number

除了1和它本身以外不再有其他的除数整除,最小的质数是2。

质数具有许多独特的性质:
(1)质数p的约数只有两个:1和p。
(2)初等数学基本定理:任一大于1的自然数,要么本身是质数,要么可以分解为几个质数之积,且这种分解是唯一的。
(3)质数的个数是无限的。
(4)质数的个数公式 𝜋(n)是不减函数。
  x越大时,𝜋(𝑥)与x的比值越接近0
  x越大时,𝜋(𝑥)与x/log⁡𝑥 的比值越接近1
(5)若n为正整数,在𝑛^2到〖(𝑛+1)〗^2 之间至少有一个质数。
(6)若n为大于或等于2的正整数,在n到n!之间至少有一个质数。
(7)若质数p为不超过n( n≥4 )的最大质数,则 p>𝑛/2 。
(8)所有大于10的质数中,个位数只有1,3,7,9。



///筛法求素数
要得到自然数n以内的全部素数,必须把不大于√n的所有素数的倍数剔除,剩下的就是素数。
给出要筛数值的范围n,找出以内的素数。
先用2去筛,即把2留下,把2的倍数剔除掉;
再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;
接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去......。

 1 ///求n以内的所有质数
 2 const int NUM=1000004;
 3 bool tag[NUM];///false是素数  素数打表
 4 int prime[79000],np=0;
 5 void Prime1()
 6 {
 7     tag[0]=tag[1]=true;
 8     int i=0,j=0;
 9     for(i=2;i<NUM;i++)
10     {
11         if(tag[i]==false){
12             prime[np++]=i;
13             for(j=i;j<NUM;j+=i){
14                 tag[j]=true;
15             }
16         }
17     }
18 }
19 int main()
20 {
21     Prime1();
22     for(int i=0;i<10000;i++){
23         cout<<prime[i]<<endl;
24     }
25 }

http://acm.hdu.edu.cn/showproblem.php?pid=1164

/**给一正整数x (1 < x<= 65535 ),将x分解为素数相乘的形式

e.g. 11->11
9412->2*2*13*181
*/

 1 const int NUM=65540;
 2 int p[NUM];
 3 void prime()
 4 {
 5     p[0]=p[1]=1;
 6     int i=2,j=0;
 7     for(i=2;i<NUM;i++)
 8     {
 9         if(p[i]==0)
10         {
11            for(j=i+i;j<NUM;j+=i){
12                 p[j]=1;
13            }
14         }
15     }
16 }
17 int main()
18 {
19     int n;
20     prime();
21     while(~scanf("%d",&n))
22     {
23         if(p[n]==0)
24         {
25             printf("%d",n);
26             continue;
27         }else
28         {
29             int j=0,i=2;
30             while(n>1)
31             {
32                 if(p[i]==0)///质数
33                 {
34                     while(n%i==0)///整除  用while  同一个质数多次相乘
35                     {
36                         if(j==0)
37                         {
38                             printf("%d",i);
39                             j++;
40                         }else
41                         {
42                             printf("*%d",i);
43                         }
44                         n/=i;
45                     }
46                 }
47                 i++;
48             }
49         }
50         printf("\n");
51     }
52     return 0;
53 }

 

http://acm.hdu.edu.cn/showproblem.php?pid=1492
/**
素数因子只含2,5,3,5,7的数为humble number
现在给一个humble number n,请给出因子个数

注:多组输入,n为64位正数
*/
/**
所用性质:

一个大于1的正整数N,如果它的标准分解式为:N=𝑃_1^(a_1 ) 𝑃_2^(a_2 )…𝑃_𝑛^(a_𝑛 ),素数乘积
那么它的正因数个数为 𝜎_0 (𝑁)=(1+𝑎_1) (1+𝑎_2)…(1+𝑎_𝑛)。


它的全体正因数之和为 𝜎_1 (𝑁)=(1+𝑃_1^1 +𝑃_1^2+…+𝑃_1^(a_1 )) (1+𝑃_2^1 +𝑃_2^2+…+𝑃_2^(a_2 ))…(1+𝑃_𝑛^1 +𝑃_𝑛^2+𝑃_𝑛^(a_𝑛 ))。
当 𝜎_1 (𝑁)=2 𝑁时就称N为完全数。

*/

问题转变为求,a1,a2,a3,a4

 1 int main()
 2 {
 3     long long n;
 4     while(~scanf("%lld",&n)&&n)
 5     {
 6         int a=1,b=1,c=1,d=1;
 7         while(n!=1){
 8             if(n%2==0)
 9             {
10                 n/=2;
11                 a++;
12             }
13 
14             if(n%3==0)
15             {
16                 n/=3;
17                 b++;
18             }
19 
20             if(n%5==0)
21             {
22                 n/=5;
23                 c++;
24             }
25 
26             if(n%7==0)
27             {
28                 n/=7;
29                 d++;
30             }
31         }
32         printf("%d\n",a*b*c*d);
33     }
34     return 0;
35 }

 

posted @ 2017-02-09 23:50  kimsimple  阅读(257)  评论(0编辑  收藏  举报