素数
素数/质数/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 }