一日一题之--求100内的素数, 求高手改进

cswat 2010-11-25 03:53:20

int main()
{

int first[101] = {0}; //数组中存放待测数组
int second[101] = {0}; //存放检测后的数字

for (int i = 0; i < 99; ++i)
{
first[i] = i + 2; // 初始化待测数组
}

int *s = first; /* 待测数字源,把数组赋给指针,数组一中的为待测数字,经过一次排除*/
int *d = second; /* 把可能是素数的数组放入数组二,下次循环把数组二作为数字源*/

for (int times = 0; times < 100 ; ++ times) // 最多可能循环100次
{
cout << *s << endl;
int beg = *s; /* 数组中的第一个数字作为基础因子,不是因子倍数的放入目标数组,下次循环*/
int *p = s; /* 每次循环都已经去掉了更小的因子,所以,因子的倍数只可能是待测数组中的一员
// p指向可能的倍数*/
int *pt = s+1; // 指向待测数字
int i = 0; /*// 指明被检测过且可能是素数的数字放到目标数组的位置*/

while ((beg * (*p) < 101) || (*pt != 0))
{
if (*pt != beg * (*p))
{
d[i] = *pt;
++i;
++ pt;
}else{
++ pt;
++ p;
}
}

d[i] = 0; // 指明有效数字结尾,


if (*d == 0) // 如果目标数组为空,检测结束
{
break;
}

int* temp = s; // 本次的目标数组将是下次循环中的源数组
s = d;
d = temp;
}
system("pause");

}
...全文
720 50 打赏 收藏 转发到动态 举报
写回复
用AI写文章
50 条回复
切换为时间正序
请发表友善的回复…
发表回复
bourbon1795 2010-11-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ljwfp 的回复:]

因子就是2 - 10就可以了,因为100的开方最大就是10,你没必要从100里都选择
[/Quote]
没错,偶数也不行,每次+2;
foutunaly 2010-11-28
  • 打赏
  • 举报
回复
怎么那么长。
jaylandz 2010-11-28
  • 打赏
  • 举报
回复
#ifndef Sieve
#define Sieve

class CSieve
{
private:
char *p_sieve;
unsigned long num;
public:
CSieve(unsigned long no);
void findPrime()const;
void printPrime();
~CSieve(){delete p_sieve;}
};
#endif
#include<iostream>

using namespace std;

#include"sieve.h"

CSieve::CSieve(unsigned long no)
{
num = no;
p_sieve = new char[num+1];
if(p_sieve == NULL)
cout<<"Not enough memory!"<<endl;
}

void CSieve::findPrime()const
{
long i,j;
for(i = 2; i < num; i++)
*(p_sieve+i) = 1;
for(i = 2; i < num; i++)
{
if(*(p_sieve+i) == 1)
{
break;
for(j = i*i; j < num; j+=i)
*(p_sieve+j) = 0;
}
}
}

void CSieve::printPrime()
{
long i,j,k=0;
for(i = 2; i < num; i++)
p_sieve[i] = 1;
for(i = 2; i < num; i++)
{
if(p_sieve[i] == 1)
{
k++;
cout<<i<<"\t";
if(k%8 == 0)
{
cout<<endl;
k = 0;
}
for(j = i*i; j < num; j += i)
p_sieve[j] = 0;
}
}
cout<<endl;
}

void main()
{
CSieve sieve(1000);
sieve.findPrime();
sieve.printPrime();
}
wang5256620 2010-11-28
  • 打赏
  • 举报
回复
让m被2~(m的开方)除,如果m不能被2~(m的开方)之中的任何
一个整数整除的话,就可以确定m是素数。
aiting788 2010-11-28
  • 打赏
  • 举报
回复
#include <stdio.h>
void main()
{


for(int i=2;i<=10;i++)
{
if(n%i==0)
{
printf("不是素数,能被%d整除",i);
break;
}

}
printf("输出%d",i);

}
xu_小兵 2010-11-27
  • 打赏
  • 举报
回复
lz威武,程序是不是复杂了些呀,很多书上都有这样的算法呀,应该没这么麻烦ba !
xu_小兵 2010-11-27
  • 打赏
  • 举报
回复

引用,佩服![Quote=引用 17 楼 yyg990441 的回复:]
引用 3 楼 frankhb1989 的回复:
C/C++ code

#include <stdio.h>

int main(void)
{
unsigned prime[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};
in……
[/Quote]
sunnyes2008 2010-11-27
  • 打赏
  • 举报
回复
难道在搞算法创新?
2220728 2010-11-27
  • 打赏
  • 举报
回复
汗,一个素数,搞得代码让人看不懂,C的东西就可以写了,行不???素数的算法。。。
spanadou 2010-11-27
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 v_july_v 的回复:]
引用 24 楼 cswat 的回复:
按照 网上介绍的 筛选法
算法可表示为:
<1> 挖去1;
<2> 用刚才被挖去的数的下一个数p去除p后面各数,把p的倍数挖掉;
<3> 检查p是否小于n^2的整数部分(如果n=1000, 则检查p<31?),如果是,则返回(2)继续执行,否则就结束;
<4> 纸上剩下的数就是素数。

我感觉我是对筛选法进行了优化, 比如,去掉2的倍数后,4的……
[/Quote]



写了个,发现跟你差不多
#include <iostream>
#include <vector>
#include <iterator>
#include <cmath>
using namespace std;

const int END_NUM = 100;

int main()
{
vector<int> numbers;

for (int idx = 2; idx<= END_NUM; idx++)
{
numbers.push_back(idx);
}

while(!numbers.empty())
{
int primeValue = *(numbers.begin());
cout<<primeValue<<endl;

numbers.erase(numbers.begin());

//执行sqrt()次筛选,就已经全部OK
if (primeValue > sqrt(END_NUM))
{
continue;
}

vector<int>::iterator iter;
for( iter= numbers.begin(); iter < numbers.end(); iter ++ )
{
if (*iter%primeValue == 0)
{
numbers.erase(iter);
iter --;
}
}
}

system("pause");
return 0;
}
一根烂笔头 2010-11-27
  • 打赏
  • 举报
回复
LZ我给你写了个帅选法求素数的程序,看看吧!

#include<iostream>
using namespace std;
int main()
{
int a[100]={0};
for(int i=0;i<100;a[i]=i,i++);
for(int i=2;i<50;i++)
{
for(int j=2;j<50;j++)
if(i*j<100)
a[i*j]=0;
}
for(int i=1;i<100;i++)
if (a[i]!=0)
cout<<a[i]<<" ";
return 0;
}
一根烂笔头 2010-11-27
  • 打赏
  • 举报
回复
好好学,继续努力,问道有先后!我看大家把你鄙视了,呵呵,好好总结这道题的算法
shangyangi 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 cheng_fengming 的回复:]
引用 3 楼 frankhb1989 的回复:
C/C++ code

#include <stdio.h>

int main(void)
{
unsigned prime[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};
in……
[/Quote]
如果数字小就全部枚举出来吧……这样会快
tomrxjh 2010-11-26
  • 打赏
  • 举报
回复
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97
AAA20090987 2010-11-26
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
//求0~SIZE之间的素数
const int SIZE = 101;
bool prime[SIZE];

int main()
{
int i, j;
memset(prime, 0, sizeof(prime));
for(i=2;i<SIZE;i++)
{
if(!prime[i])
{
j = 2;
while(i*j < SIZE)
{
//素数的倍数不是素数
prime[i*j] = true;
j++;
}
}
}
for(i=2;i<SIZE;i++)
if(!prime[i])
cout << i << "\t";
cout << endl;
return 0;
}


求某个范围内的素数,用这个程序最方便

PS:LZ写的程序效率不够高,程序也不用这么长吧
zanglengyu 2010-11-26
  • 打赏
  • 举报
回复
楼主加油 算法不错

就是效率比 一般的高不高
ylyy2002 2010-11-26
  • 打赏
  • 举报
回复
这个不是要用开方来求约数的么?

C语言那本书上头几页就有这个例子啊!
v_JULY_v 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 v_july_v 的回复:]
引用 24 楼 cswat 的回复:
按照 网上介绍的 筛选法
算法可表示为:
<1> 挖去1;
<2> 用刚才被挖去的数的下一个数p去除p后面各数,把p的倍数挖掉;
<3> 检查p是否小于n^2的整数部分(如果n=1000, 则检查p<31?),如果是,则返回(2)继续执行,否则就结束;
<4> 纸上剩下的数就是素数。

我感觉我是对筛选法进行了优化, 比如,去掉2的倍数后,4的……
[/Quote]

最后,输出的时候,if 那里 漏了个括号。添上去。
for(i=1,n=0;i<=100;i+)
{
if(a[i]!=0)
{
printf("%3d",a[i]);
n++;
}
}
//....
v_JULY_v 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 cswat 的回复:]
按照 网上介绍的 筛选法
算法可表示为:
<1> 挖去1;
<2> 用刚才被挖去的数的下一个数p去除p后面各数,把p的倍数挖掉;
<3> 检查p是否小于n^2的整数部分(如果n=1000, 则检查p<31?),如果是,则返回(2)继续执行,否则就结束;
<4> 纸上剩下的数就是素数。

我感觉我是对筛选法进行了优化, 比如,去掉2的倍数后,4的倍数也一定被挖掉了,因为4含有2的因子,……
[/Quote]

挺好。

//简单的,利用数组,
//a[1]...a[100],置为1.2....100.特意不用a[0]
for(i=1;n<=100;i++)
a[i]=i;
a[1]=0; //先去掉。
for(i=2;i<sqrt(100);i++) //注意,这里也是用筛选法,到sqrt(100)。
for(j=i+1;j<=100;j++)
{
if(a[i]!=0 && a[j]!=0)
if(a[j]%a[i]==0)
a[j]=0; //把非素数置为0,下面,只要 if(a[i]!=0),就输出它。
}
for(i=1,n=0;i<=100;i+)
{
if(a[i]!=0)
printf("%3d",a[i]);
n++;
}
//然后,是对一些输出格式的控制,省略了....


最后,希望Lz,坚持下去。
基本功,基础问题是否扎实,永远是硬道理。
hinada99 2010-11-26
  • 打赏
  • 举报
回复
每天坚持顶帖
加载更多回复(29)

64,637

社区成员

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

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