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

【算术基本定理】任意一个大于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;

}


 


 

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值