标程:素数表 与 质因数分解 - Acumon的博客 - IT博客网
来源:互联网 发布:力和能量的公式知乎 编辑:程序博客网 时间:2024/05/22 23:59
导读:
本文转自
http://www.cnitblog.com/cockerel/archive/2006/07/11/13479.html
特别鸣谢飞飞提醒,生成素数表效率一下提高了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 ;
}
/**/ /* 解决:素数表
*算法:筛法
*输入:范围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 ;
}
本文转自
http://www.cnitblog.com/cockerel/archive/2006/07/11/13479.html
- 标程:素数表 与 质因数分解 - Acumon的博客 - IT博客网
- 素数表 与 质因数分解
- 分解质因数,生成素数表
- 素数打表,质因数分解
- Miller_Rabin素数测试与Pollard_Rho分解质因数
- Ural1055(素数打表+分解质因数)
- poj 1811解题报告——关于大数的素数鉴定与质因数分解
- 基础数论算法(六) 素数的筛法与质因数分解
- 数论之素数(质因数分解与筛法)
- 判断素数及质因数分解
- 水仙花数&素数&质因数分解的C语言实现
- 我的IT博客
- 我的IT博客
- 一个线性时间复杂度的质因数分解函数(查找全部的素数、得到全部的质因数分解个数)
- 数的分解、分解质因数
- 分解质因数的问题
- 分解正整数的质因数
- 正整数的质因数分解
- 兄弟姐妹的程序员们要注意身体喽
- ORA-01779: cannot modify a column which maps to a non-key-preserved table
- DgbView 调试类
- OpenLayers 项目分析[转](三):BaseTypes (续)
- windows下安装dspace
- 标程:素数表 与 质因数分解 - Acumon的博客 - IT博客网
- 风雨飘摇的CakePHP
- Dot Net 设计模式—简单工厂
- 一个分组查询的月份报表的存储过程
- OpenLayers项目分析[转](四)空间数据的组织与实现
- PHP小贴士
- 让远程终端连接不再限制
- OpenLayers项目分析[转](五):数据解析——以GML为例
- oracle SQL简介(五)