素数问题

mm6688 2009-06-19 01:27:12
#include <iostream>
using namespace std; //筛法求素数

void main()
{
int MAX_NUM,a,b;
cout <<"请输入区间:\n";
cin>>a>>b;
cout<<"<"<<a<<","<<b<<">\n";
MAX_NUM=2*(b-a+1);

unsigned char *sieve;
sieve = new unsigned char[MAX_NUM+1];

long i, j, k=0;
for (i=a; i <= b; i++) //将全部数放进筛子
sieve[i] = 1;
for (i=a; i <= b; i++)
{
if (sieve[i] == 1) //如果i在筛子里,也即i是素数
{ k++;
cout <<i <<",";
if (k % 15 == 0)
{
cout <<"\n";
k = 0;
}
for (j=i*i; j<= b; j += i) //将素数i的倍数取出
sieve[j] = 0;
}
}
cout <<"\n";
delete[]sieve;
}
请修改程序实现以下功能:若输入区间为任意区间<a,b>,输出a~b之间的素数。
我输入<5,11>,输出的数中有很多不是素数。。。达人指教下。。。
...全文
73 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
AvalonZST 2009-11-17
  • 打赏
  • 举报
回复
也不是非得是 unsigned char* 型的 ;
按照其用途来看 bool型的 更节约空间!!!
yyplq 2009-06-19
  • 打赏
  • 举报
回复
为什么要用unsigned char*
不明白请高手指教
beyond071 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mm6688 的回复:]
其实我和5楼的想法是一样的 只是总觉得这样做的话有点耍赖 不过3楼的做得更好。。
[/Quote]
请楼主仔细分析下吧3楼和5楼的做法 可以说是一模一样的^_^

有啥耍赖的呢 筛选法就是得从最小的素数开始筛 要得到某个区间的 也得全部都筛完!

就三步,第一步初始化区间[2, b]; 第二步,从2开始在区间[2, b]内筛除素数的倍数; 第三部,输出区间[a, b]内标志仍然为1的元素,即素数
lpf000 2009-06-19
  • 打赏
  • 举报
回复
if (sieve[i] == 1) //如果i在筛子里,也即i是素数
楼主还没没判断是不是素数的代码吧
而且你的区间也是有限
貌似 筛选法 按其字面意思,应该是把全部区间存入数组,然后用一个一定范围的数去除输入数组,除尽的改为0,除不尽的继续直到你指定的除数范围除完就可以输出了吧
mm6688 2009-06-19
  • 打赏
  • 举报
回复
其实我和5楼的想法是一样的 只是总觉得这样做的话有点耍赖 不过3楼的做得更好。。
beyond071 2009-06-19
  • 打赏
  • 举报
回复
从区间[2,b]筛选,然后输出区间[a,b]的结果。

int MAX_NUM,a,b;
cout <<"请输入区间:\n";
cin>>a>>b;
cout <<" <" <<a <<"," <<b <<">\n";
MAX_NUM = b;

unsigned char *sieve= new unsigned char[MAX_NUM+1];
long i, j, k=0;

for (i=0; i <= MAX_NUM; i++) //将全部数放进筛子
sieve[i] = 1;
for (i=2; i <= b; i++)
{
if (sieve[i] == 1) //如果i在筛子里,也即i是素数
{
for (j = i + i; j <= b; j += i) //将素数i的倍数取出
sieve[j] = 0;
}
}
for(i = a; i <= b; i++)
{
if (sieve[i] == 1)
{
k++;
cout <<i <<",";
if (k % 15 == 0)
{
cout <<"\n";
k = 0;
}
cout <<"\n";
}
}
delete[]sieve;
mm6688 2009-06-19
  • 打赏
  • 举报
回复
哦 原来是这样的啊 我就是不懂这个算法 太复杂了。。。
liao05050075 2009-06-19
  • 打赏
  • 举报
回复
筛素数确实要从2开始,然后去掉它的倍数,
然后从下一个素数3开始,去掉它的倍数。


#include <iostream>
using namespace std; //筛法求素数

void main()
{
int MAX_NUM,a,b;
cout <<"请输入区间:\n";
cin>>a>>b;
cout <<" <" <<a <<"," <<b <<">\n";

unsigned char *prime;
prime = new unsigned char[b+1];

long i, j, k=0;
for (i=0; i <= b; i++) prime[i] = 1; //初始化,假没全部为素数
prime[0]=prime[1]=0;
for (i=2; i <= b; i++) //筛法求素数
{
if(!prime[i])continue;//当前的数不是素数
for(j=2;j*i<=b;j++) prime[j*i]=0;//把当前素数的倍数去掉
}
for(i=a;i<=b;i++)
if(prime[i]) cout<<i<<' ';
cout <<"\n";
delete[]prime;
}
ltc_mouse 2009-06-19
  • 打赏
  • 举报
回复
lz的算法只适用于a=2的情形~~ 筛选法,要从自然数2开始吧....
lingyin55 2009-06-19
  • 打赏
  • 举报
回复
我输入 <5,11>,输出的数中有很多不是素数。。。

你的程序本来就有问题,一开始
for (i=a; i <= b; i++) //将全部数放进筛子
sieve[i] = 1;
全为1,之后在
for (i=a; i <= b; i++)
{
if (sieve[i] == 1) //如果i在筛子里,也即i是素数
{ k++;
cout < <i < <",";
if (k % 15 == 0)
{
cout < <"\n";
k = 0;
}
for (j=i*i; j <= b; j += i) //将素数i的倍数取出
sieve[j] = 0;
}
}
这个循环中,还没有加判断就输出
if (sieve[i] == 1) //如果i在筛子里,也即i是素数
{ k++;
cout < <i < <",";
这样只是把输入的区间都输出出来。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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