算数基本原理及求一定范围内的素数

【算术基本定理】任意一个大于1的整数,都能表示成若干个质数的乘积,如果不计质因数的顺序,则这个分解式是唯一的。即任意一个大于1的整数

  a1=[p1×p2×p3×……×pn(p1≤p2≤p3≤……≤pn)其中p1、p2、p3、…、pn都是质数;并且若

  a1=q1×q2×q3×…qm(q1≤q2≤q3≤…≤qm)

  其中q1、q2、q3、…、qm都是质数。那么,m=n,qi=pi(i=1,2,3,…,n)

当这个整数是质数时是符合定理的特例。素数即是质数。

【求一定范围里的素数】说明:解决这个问题的诀窍是如何安排删除的次序,使得每一个非质数都只被删除一次。       中学时学过一个因式分解定理,他说任何一个非质(合)数都可以分解成质数的连乘积。例如,16=4^2,18=2 * 3^2,691488=2^5 * 3^2 * 7^4等。如果把因式分解中最小质数写在最左边,有16=4^2,18=2*9,691488=2^5 * 21609,;换句话说,把合数N写成N=p^k * q,此时q当然是大于p的,因为p是因式分解中最小的质数。由于因式分解的唯一性,任何一个合数N,写成N=p^k * q;的方式也是唯一的。 由于q>=p的关系,因此在删除非质数时,如果已知p是质数,可以先删除P^2,p^3,p^4,...  ,再删除pq,p^2*q,p^3*q,...,(q是比p大而没有被删除的数),一直到pq>N为止。

求2~20之间的素数prime函数如下:

#include<iostream>

using namespace std;

const int maxn=1000001;

int mark[maxn];

void prime()

{

     int i;

     for(i=2;i*i<maxn;i++)

     {

         if(mark[i]==0)

         {

            for(int j=i*i;j<maxn;j+=i)

               mark[j]=1;

          }

      }

}

int main()

{

     prime();

     for(int i=2;i<=20;i++)

     if(mark[i]==0)

     cout<<i<<endl;

     return 0;

}


 


 

  

你可能感兴趣的:(C语言,算术基本原理)