用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;
} 展开
#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;
} 展开
1个回答
展开全部
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;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询