sduzgz

素数查找

 

//应该注意的是定义数组本身的大小,数组不要越界,循环的初始值及结束值设置
#include<iostream>
#include
<cstdlib>
#include
<cmath>
#define N (100)
using namespace std;

int main()
{
int i,j;
bool prim[N];
/*for(i=0;i<N;i++)
{
prim[i]=true;
}
*/

memset(
&prim,true,sizeof(prim));
//memset(prim,true,sizeof(prim));这个也可以,为什么呢?
int M=sqrt(N);
for(i=2;i<=M;i++)
{
for(j=i+i;j<=N;j=j+i)
{
prim[j
-1]=false;
}

}

for(i=2;i<N;i++)
{
if(prim[i]==true)
{
    cout
<<i+1<<' ';
}

}

cout
<<endl;
system(
"pause");
return 0;
}

posted on 2010-09-25 18:49 sduzgz 阅读(479) 评论(4)  编辑 收藏 引用

Feedback

# re: 素数查找 2010-09-28 19:04 李现民

不要使用using namespace std; 因为std命名空间里的东西全是一些常见的名字, 像string, vector, list等等,直接使用std::string,以防止重名

#define N 100可以使用const常量代替(并且,尽量放到一个空的namespace下),否则你需要定义成#define N (100),加括号,这是常识

prim[i]=true;的那个循环可以改成memset(&prim, 1, sizeof prim)

for(i=2;i<=sqrt(N);i++)---请把sqrt(N)拿到循环外面来

看你写代码的样子,应该是vc6吧,把int i,j;放后面点吧,不过在在未使用的地方就定义变量,比如int j完全可以放到循环内部定义
  回复  更多评论   

# re: 素数查找 2010-09-28 22:11 张爱静

牛人啊,我这习惯确实很多问题啊,命名空间那个我可以明白,你说的prim[i]那个循环还有最后sqrt(N)拿到外面,改成那样有什么好处啊,虽然觉得好,但是不知道为什么。@李现民
  回复  更多评论   

# re: 素数查找 2010-09-29 10:14 李现民

memset是一种高效的数组初始化方式,它本身是用汇编写的,vc下应该是位于memset.asm中,当你使用部分初始化时, 比如int a[100]={0}, 你会看到它的汇编代码其实用的就是memset。

把sqrt(N)拿到外面那个, 你不觉得你的代码中每次循环sqrt(N)都会调用一遍嘛?当然, 现代编译器的话,这种简单的调用可以被优化掉,但作为码农, 你不应该写成这样  回复  更多评论   

# re: 素数查找 2010-09-29 10:25 张爱静

@李现民
奥,茅塞顿开啊,谢谢啊!
  回复  更多评论   



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


My Links

Blog Stats

常用链接

留言簿

随笔档案

搜索

最新评论

  • 1. re: 素数查找
  • @李现民
    奥,茅塞顿开啊,谢谢啊!
  • --张爱静
  • 2. re: 素数查找
  • 评论内容较长,点击标题查看
  • --李现民
  • 3. re: 素数查找
  • 牛人啊,我这习惯确实很多问题啊,命名空间那个我可以明白,你说的prim[i]那个循环还有最后sqrt(N)拿到外面,改成那样有什么好处啊,虽然觉得好,但是不知道为什么。@李现民
  • --张爱静
  • 4. re: 素数查找
  • 评论内容较长,点击标题查看
  • --李现民
  • 5. re: 接口,虚函数及纯虚函数
  • 分得太细反而着了相, 不要太看重语法上的区别,这些东西都是基于应用而衍生的,多研究一些设计的东西, 比仔细区分这些语法概念要合算
  • --李现民

阅读排行榜

评论排行榜