关于素数
来源:互联网 发布:喵咚家 知乎 编辑:程序博客网 时间:2024/05/18 00:00
关于素数
作者:焦祺 09-03-22
传统方法判素数
n:判断n是否素数
返回值:素数返回1,否则返回0
源程序:
int prime(int n)
{
if(n<2)return 0;
if(n==2)return 1;
if(n%2==0)return 0;
for(int i=3;i<=sqrt(double(n));i+=2)
if(n%i==0)
return 0;
return 1;
}
筛法求素数:
const int N = 25600000;
bool a[N];
int p[N];
int n;
void Prime1() {
memset(a, 0, n * sizeof(a[0]));
int num = 0, i, j;
for(i = 2; i < n; ++i) if(!a[i]) {
p[num++] = i;
for(j = i+i; j < n; j +=i) {
a[j] = 1;
}
}
}
线性求素数:
const int N = 1000005;
bool a[N];
int p[N];
// bool hash[1000005]; 记录某数是否为素数
void Prime2(int n) //线性法,参数表示要打多少内的素数
{
memset(a, 0, n*sizeof(a[0]));
// memset(hash,0,sizeof(hash));
int num = 0, i, j;
for(i = 2; i < n; ++i)
{
if(!(a[i]))
{
p[num++] = i;
// hash[i] = 1;
}
for(j = 0; (j<num && i*p[j]<n); ++j)
{
a[i*p[j]] = 1;
if(!(i%p[j])) break;
}
}
}
经典题目: PKU 2262 Goldbach's Conjecture
http://acm.pku.edu.cn/JudgeOnline/problem?id=2262
题解可以访问以下网址
http://blog.csdn.net/jqandjq/archive/2009/03/22/4013876.aspx
这种线性打素表的另一方面的应用:
把a[]改成int类型,然后
void Prime2() {
memset(a, 0, n*sizeof(a[0]));
int num = 0, i, j;
for(i = 2; i < n; ++i) {
if(!(a[i])) p[num++] = i;
for(j = 0; (j<num && i*p[j]<n && (p[j]<=a[i]||a[i]==0)); ++j) {
a[i*p[j]] = p[j];
}
}
}
这样一来a[i]将记录i的最小质因子
那么[0, n)内的数的因式分解就可以... 嘿嘿
o(质因子个数)求任意数因式分解:
void factor(int x) {
while(a[x] != 0) {
printf("%d/n", a[x]);
x /= a[x];
}
printf("%d/n", x);
}
参考网页及文献:
http://hi.baidu.com/miaoever/blog/item/b5e3f9b32d24eca2d9335adc.html
http://cylixstar.blogbus.com/logs/10601589.html
- 关于素数
- 关于素数
- 关于素数
- 关于素数
- 关于素数
- 关于素数
- 关于素数
- 关于素数
- 关于素数
- 关于素数
- 关于素数总结:
- 关于素数的判断
- [日常] 关于求素数
- [日常] 关于求素数
- 关于素数的算法
- 关于JAVA求素数
- 关于素数的研究
- 关于素数的问题
- 如何设置CSDN博客使用Live Writer?
- 调试经验总结-VC下的错误对话框
- 优秀程序员的十个习惯
- 对类似COM和C++派生的一些理解
- Linux上编程控制skype
- 关于素数
- 图片走廊
- 动态调用WebService(C#)
- 怎样在网页中插入视频?
- Google C++编程命名约定
- C#动态加载DLL
- CSS中解决受到FLOAT影响的方法
- 在你的代码中使用Boost智能指针
- 结构体数组