posts - 274,  comments - 1258,  trackbacks - 0

特别鸣谢飞飞提醒,生成素数表效率一下提高了40%之多!

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 < Len; j += cur)
                    p[j]
= 1 ;
                
if (j == 2 * i * (i + 1 )) // 筛完,可照抄
                     break ;
            }

        }

        
for ( ++ i;i < Len;  ++ i) // 照抄
             if ( ! p[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 = 0 ;i < pp;i ++ ) {
            
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
< cstdio >
int  main() {
    init();
    factorization(
293910 );
    
int  i;
    
for (i = 0 ;i < dp; ++ i) {
        printf(
" +%d^%d " ,d[i],e[i]);
    }

    printf(
" \n " );
    
return   0 ;
}




posted on 2006-07-11 00:24 踏雪赤兔 阅读(1394) 评论(0)  编辑 收藏 引用 所属分类: 零件仓库
只有注册用户登录后才能发表评论。

百度空间| 见闻日记| 编程感悟
我的twitter


LOGO

自我介绍:百度厂基础平台车间的一名挨踢民工。擅长C++、算法、语言设计、分布式计算,也用过Java,Python, PHP,JS/AS等语言开发。请关注我的twitter (免翻墙版) 发QQ消息


添加到收藏夹 Locations of visitors to this page

常用链接

随笔分类(300)

随笔档案(274)

文章分类(38)

相册

收藏夹(54)

与博主互动

博客手拉手

搜索

  •  

积分与排名

  • 积分 - 399490
  • 排名 - 10

最新评论

阅读排行榜

评论排行榜