求第K大的素数

nandizhu 2009-02-25 10:07:27
加精
如题

k=1 输出 2
k=2 输出 3

1=<k<=10000

时间限制 :1S


我的算法(不过好像有点超时。。。)

#include <iostream>
using namespace std;

long f(int *A,int k)
{
if (k==1)
{
return 2;
}
A[0]=2;
int i=3;
int index;
for (;A[k-1]==0;i+=2)
{
for (index=0;A[index]!=0;++index)
{
if (i%A[index]==0)
{
break;
}
}
if (A[index]==0)
{
A[index]=i;
}
}
return A[k-1];
}

int main()
{
int n=10000;
int *A=new int[n];
for (int i=0;i<=n-1;++i)
{
A[i]=0;
}
int k;
cin>>k;
cout<<f(A,k);
system("pause");
return 0;
}
...全文
4394 91 打赏 收藏 转发到动态 举报
写回复
用AI写文章
91 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamzhaiwei 2012-04-15
  • 打赏
  • 举报
回复
发错了
iamzhaiwei 2012-04-15
  • 打赏
  • 举报
回复
看看这个帖子讨论的
http://topic.csdn.net/u/20090225/22/065378f6-4cf7-4d2d-9997-ddb8a2481347.html?17222
twlkyao 2012-04-13
  • 打赏
  • 举报
回复
这个问题呢很经典啊,值得好好研究下
nie569 2011-04-01
  • 打赏
  • 举报
回复
刚刚上到这个网站,看到这个帖子有点晚了,计算素数我有一个极好的方法.只使用加法和比较就可以完成n以下全部素数的计算.
我已经编出一个求解10的16次方以下所有素数的程序,这个程序有点长,我作些修改,以适应找到第k个素数.只是我还不知道怎么上传这个执行程序.
索要可执行程序可以邮件联系.nie569@sohu.com
  • 打赏
  • 举报
回复
[Quote=引用 86 楼 cloud976 的回复:]
这叫求第K小?素数是无限的,你怎么求第K小?
[/Quote]

哈哈哈哈,我被你这句话雷倒了。
cloud976 2009-03-09
  • 打赏
  • 举报
回复
[Quote=引用 84 楼 CCppMfc 的回复:]
我倒, 这叫求第K小的素数.

我还以为是什么牛比算法真能求出第K大的呢.
[/Quote]

这叫求第K小?素数是无限的,你怎么求第K小?
yhtbyr 2009-03-04
  • 打赏
  • 举报
回复
麻烦死了
relive_qiankai 2009-03-04
  • 打赏
  • 举报
回复
关注,数据结构不好.很高深~氛围很热烈!
ecoswaybin 2009-03-04
  • 打赏
  • 举报
回复
喜欢自由自在的,不受约束的生活,我的生活我主宰的自主派。18年寒窗苦读,毕业,找工作,工作,换工作……一晃五年已过,毕业时心中的那个目标,已被现实给揉碎!是为了生存而工作,还是为了更好的生活,而做出抉择?选择,需要勇气与智慧。遇到科士威是机缘巧遇,是一种灵魂深处的碰撞,由此结缘,并深深的爱上她!交流QQ:291163800
CCppMfc 2009-03-04
  • 打赏
  • 举报
回复
我倒, 这叫求第K小的素数.

我还以为是什么牛比算法真能求出第K大的呢.
cloud976 2009-03-03
  • 打赏
  • 举报
回复
用除比自己小的所有素数的方法效率未必会很低
在这个循环中

for (i=0;i<num;i++)
{
if(p_list[i]==0)break;
if(m%p_list[i]==0)
{
sign = 0;
break;
}
}

更多的时候在前几个数就已经跳出了,数学好的兄弟可以大概估算下这里的平均循环的次数,并不是随着num增加会增加的非常快的。
tosshl 2009-03-03
  • 打赏
  • 举报
回复
新手学习
yuyub 2009-03-03
  • 打赏
  • 举报
回复
mathematics
拼错了,呵呵!
不过,mathematics有点像楼主写的
我觉得楼主写的不错啊!
还有litaoye的算法和楼主的原理差不多,只是方向不一样
楼主一个一个挑出素数,而litaoye是把不是素数的去掉
楼主是与除为主要运算,而litaoye是以乘。
liaoye刚开始的不足是没有以素数为基础,只要把素数的倍数去掉就可以了,这样就不会存在重复去掉的动作。
yuyub 2009-03-03
  • 打赏
  • 举报
回复

引用 1 楼 nandizhu 的回复:
再弱弱问一句。。。

判断一个数是否素数是不是可以除以比它小的所有素数

如果都不能除尽就可以说明是素数????



可以。
我看过Materlab的自带函数里的返回小于A的所有素数,就是这么搞的
zhuweiping2003 2009-03-03
  • 打赏
  • 举报
回复
好贴先 Mark 一下
fireseed 2009-03-03
  • 打赏
  • 举报
回复
// 算法:打印出第n个素数
// 循环判断每一个2以上的奇数是否是素数,判断方法是用它除以比它小的素数。
// 从3开始除,除到它的开方数就判断结束。如果都不能整除,就是素数。
// 如果是素数,添加到素数链表,并开始下一次判断
// 当素数表超过给定值时,打印素数表最后一项
#include <iostream>
#include <vector>
#include <math.h>
void main( void )
{
typedef std::vector<int> PRIMTABLE;
PRIMTABLE Primes( 1, 2 ); // 素数表
for ( int i = 3; Primes.size() < 10000; i += 2 )
{ // 上面的10000表示输出第10000个素数,可以改为任意数
int nSqrt = (int)sqrt( (float)i );
PRIMTABLE::iterator cur;
for ( cur = Primes.begin(); *cur <= nSqrt && 0 != i % *cur; ++cur );
if ( *cur > nSqrt ) Primes.push_back( i );
}
std::cout << Primes.back() << std::endl;
}
chenwei175528 2009-03-03
  • 打赏
  • 举报
回复
mark and up and study
qq135250 2009-03-03
  • 打赏
  • 举报
回复
自动刷分准备器V3.0
laidasong 2009-03-02
  • 打赏
  • 举报
回复
.......也许有些不是很好的。。
zzh2106 2009-03-02
  • 打赏
  • 举报
回复
//我也写了段代码,K=10000在自己机器上测试运行时间在0-16毫秒之间。经常报0毫秒,CPU是E8300
void KPrime()
{
int i=1,j=0,k=0,num=1;
int a[10000]={2,3,};
cout<<"pls input the index of prime number:";
cin>>k;
if(k<=0 || k > 10000)
{
cout<<"K out of range!"<<endl;
return;
}
if(1 == k)
{
cout<<"The first prime num is: 2"<<endl;
}

for(;i<k;)
{
j = 0;
num+=2;
int temp = (int)sqrt(num);
while((num%a[j] != 0) && (temp > a[j]))
{
j++;
}

if(num%a[j] == 0)
continue;
else
{
a[i] = num;
i++;
continue;
}

}
cout<<"The "<<k<<"th prime num is: "<<a[k-1]<<endl;
}
加载更多回复(70)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧