用C++求1000以内质数,新手求教

小弟最近才开始学习C++,遇到这样一条题目,书上给出答案,但是我看不懂,特别是while语句里面的条件,求各路大神指教#include"stdafx.h"#include... 小弟最近才开始学习C++,遇到这样一条题目,书上给出答案,但是我看不懂,特别是while语句里面的条件,求各路大神指教
#include "stdafx.h"
#include <math.h>

bool EnumPrimeNum(const int max)
{
int isqr = (int)sqrt(max);
int *pvar = new int[isqr];
for (int j=0; j<isqr; j++)
pvar[j] = 0;

int i = 2;
bool ret = true;
while (ret && i <= (int)sqrt(max))
{
if (pvar[i-2]==0)
{
if (max % i ==0)
ret = false;
else
{
int next = i + i;
while (next < (int)sqrt(max))
{
pvar[next-2] = 1;
next += i;
}
}
}
i++;
}
delete []pvar;
return ret;
}

int main(int argc, char* argv[])
{
int num = 1000;
int counter = 0;
for(int i = 2; i< num; i++)
if (EnumPrimeNum(i))
{
counter++;
printf("%4d",i);
if (counter % 10 == 0)
printf("\n");
}

return 0;
}
展开
 我来答
仙戈雅3n
2015-09-04 · TA获得超过5790个赞
知道大有可为答主
回答量:2398
采纳率:75%
帮助的人:905万
展开全部

bool EnumPrimeNum(const int max)
{
int isqr = (int)sqrt(max);
int *pvar = new int[isqr];
for (int j = 0; j < isqr; j++)
pvar[j] = 0;
int si = sizeof(pvar);
int i = 2;
bool ret = true;
while (ret && i <= (int)sqrt(max))  
{
// 判断下标为i-2的元素是否等于0
if (pvar[i - 2] == 0) 
{
// 如果目标数max能整除i,则设为false,即为合数而非质数
if (max % i == 0)
ret = false;
else
{
// next的值为i的2倍
int next = i + i;
// 如果next小于max的算术平方根
while (next < (int)sqrt(max))
{
/*
  这里算法思想是这样的:
  如果i是奇数,那么2i以后的奇数下标将为1
  如果i是偶数,那么2i以后的偶数下标将为1
  它的作用就是减少后面的判断可以直接跳奇或偶下标
  
  但这个算法是多此一举的,因为i执行次数未变
  也就是说,这个算法的时间复杂度依然还是O(sqrt(n)/2)
*/
pvar[next - 2] = 1;
next += i;
}
}
}
i++;
}
delete[]pvar;
return ret;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式