素数表 与 质因数分解

来源:互联网 发布:淘宝卖数据 编辑:程序博客网 时间:2024/05/01 18:24
导读:
  namespace?primeNS{
  /*解决:素数表
  *算法:筛法
  *输入:范围MaxN
  *输出:素数个数pp,?素数表[p[0],p[pp])
  *备注:效率:1千万时,sicily-0.59?ZOJ-0.85?(朴素版sicily1.00)
  */????const?int?MaxN=?10000000?//查找[2,maxN]范围的素数????const?int?Len=?MaxN/2+1????int?p[Len]={2}????,pp=1????void?init(){
  int?i,j,cur;
  for(i=1?;?++i){
  if(!p[i]){
  p[pp++]=cur=i*2+1//找到一个素数????????????????for(j=2*i*(i+1);?j  p[j]=1????????????????if(j==2*i*(i+1))//筛完,可照抄????????????????????break????????????}????????}????????for(++i;i  p[pp++]=i*2+1????}/**/????/*解决:质因数分解
  *算法:顺搜,逐个测试
  *输入:待分解数num,?init()的输出
  *输出:质因数个数dp,?质因数表d[0dp-1],指数表e[0dp-1];
  *备注:若num>=MaxN^2,可能会将所有大于MaxN的质因数之积看作一质因数
  */????int?d[Len],e[Len],dp;
  void?factorization(int?num){
  int?i,cnt,div;
  dp=0????????for(i=0i  if(num%p[i]==0){
  d[dp]=p[i];
  div=p[i]*p[i];?cnt=1????????????????while(num%div==0){
  div*=p[i];
  ++cnt;
  }????????????????e[dp++]=cnt;
  div/=p[i];
  if((num/=div)==1)
  break????????????}????????}????????if(num!=1){
  d[dp]=num;?e[dp++]=1????????}????}}using?namespace?primeNS;
  #include  init();
  factorization(293910);
  int?i;
  for(i=0i  printf("+%d^%d",d[i],e[i]);
  }????printf("/n");
  return?0}

本文转自
http://www.cnitblog.com/cockerel/archive/2006/07/11/13479.html
原创粉丝点击