| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2060 人关注过本帖
标题:[讨论]寻找求一数是否为 [素数]的最优算法
只看楼主 加入收藏
oclassic
Rank: 1
等 级:新手上路
帖 子:140
专家分:0
注 册:2007-4-18
收藏
 问题点数:0 回复次数:19 
[讨论]寻找求一数是否为 [素数]的最优算法
求素数,有什么好的算法。执行效率较高的。
搜索更多相关主题的帖子: 素数 算法 效率 
2007-04-23 16:55
YANGDAN123
Rank: 1
等 级:新手上路
帖 子:97
专家分:0
注 册:2007-1-16
收藏
得分:0 

老谭的书上有啊~


我将用我全部的时间去寻找我生命和灵魂的唯一伴侣,得之,我幸,不得,我命。
2007-04-23 17:23
wen1000
Rank: 1
等 级:新手上路
帖 子:52
专家分:0
注 册:2007-4-5
收藏
得分:0 
老谭的练习有答案吗?
2007-04-23 18:17
初心者1号
Rank: 1
等 级:新手上路
帖 子:42
专家分:0
注 册:2007-3-31
收藏
得分:0 
#include<stdio.h>
void main()
{
int n,k=2;
printf("请输入一个正整数");
scanf("%d",&n);
printf("%d=",n);
while(n>=k)
{
while(n%k!=0)
{
k++;
}
printf("*%d",k);
n/=k;
}
}
2007-04-23 21:55
dinggx_2045
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-3-30
收藏
得分:0 
以下是引用初心者1号在2007-4-23 21:55:36的发言:
#include<stdio.h>
void main()
{
int n,k=2;
printf("请输入一个正整数");
scanf("%d",&n);
printf("%d=",n);
while(n>=k)
{
while(n%k!=0)
{
k++;
}
printf("*%d",k);
n/=k;
}
}

请教:这是判断素数的方法吗?
类似与分解,感觉,
还不是质因数分解,好象

2007-04-28 16:42
dinggx_2045
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-3-30
收藏
得分:0 
回复:(oclassic)[讨论]寻找求一数是否为 [素数]的...

#include <math.h>
bool isSuShu(long n)
{
long K = (long)sqrt(n) ;
long num ;
for(num = 2 ; num < K ; num++)
{
if(n%num == 0)
{
return false ;// 不是素数
}
}
return true ;// 是素数

}

调试调试吧

效率为 sqrt(n) ;

2007-04-28 16:49
linuxbabya
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2007-4-19
收藏
得分:0 

测试k是否为素数。可以用k去除m,m为奇数,故m+=2,且m小于sqrt(k)。
if(k%m!=0),就说明k是素数,这个效率高些。

2007-04-28 18:27
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 
http://hi.baidu.com/pcrazyc

我在博客中第一遍浅淡素数有说明,可以参考一下

雁无留踪之意,水无取影之心
2007-04-28 18:35
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 

本人又优化了一下,程序如下:

[CODE]#include<iostream>
#include<time.h>
#define N 100000000
bool a[N];
using namespace std;
void prime(unsigned long n) //用筛法将不是素数的值置0
{
unsigned long i,j;
a[0]=1; //2是唯一的偶素数,另作打算
for(i=3;i<=n;i+=2) //将大于2小于或等于n的奇数
a[i/2]=1;
for(i=3;i<=n/3;i+=2) //只要考虑小于n/3的就可以了,因为乘以2就是偶数,至少也是乘以3,
大于n/3的就不用判断
{
if(a[i/2])
for(j=i*3;j<=n;j+=2*i) //j的奇数倍的数全部筛选出去
a[j/2]=0;
}
}
int main()
{
unsigned long n,sum,i;
clock_t start,finish;
while(scanf("%d",&n))
{
start=clock();
prime(n);
sum=1;
for(i=3;i<=n;i+=2)
if(a[i/2])
sum++;
cout<<"the number of the prime less than n is "<<sum<<endl;
finish=clock();
cout<<"the promgram expends "<<(double)(finish-start)<<"ms"<<endl;
}
return 0;
}[/CODE]

详情参考:http://hi.baidu.com/pcrazyc


雁无留踪之意,水无取影之心
2007-04-28 20:46
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 

输出1亿内的素数个数只需要5秒左右


雁无留踪之意,水无取影之心
2007-04-28 20:49
快速回复:[讨论]寻找求一数是否为 [素数]的最优算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016422 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved