使用平方根计算Primes,以及算法构建查询

时间:2013-02-27 03:25:48

标签: c++ algorithm for-loop square-root

以下是素数的计算。我试图解构它以更好地理解循环。此外,我想调整此函数,通过比较一个数字与其平方根而不是这种方式来查找素数:

(假设在int main之前做出了适当的声明)

//确定数字是否为素数

bool isPrime (long n)
{
    int a;

    if (n == 1)
    {
        return false;
    }

    for (a = 2; a <= (n / 2); a++)
    {
        if ((n % a) == 0)
        {
            return false;
        }

    }
    return true;
}

然而,观察这个循环,我有一个问题,看我是否正确地观察这个函数开始。从我看来,看起来int a;是计数器,它从2开始,因为0和1不是素数。 n应该是形式变量。它指出,对于除以2时小于或等于其自身的每个数字,如果剩余大于零,则返回bool的true。同时,如果一个数字均匀地除以2(所以没有余数),那么它不被认为是素数(bool返回false)。那个听起来是对的吗?如果没有,请让我知道我在哪里做错了。如果我做对了,那就到了节目的后半部分。

现在,primeCount;仅限于primeCount (2, 50000);,但第一个功能在此输入:

//使用isPrime函数计算和组织素数

long primeCount (long x, long y)
{
    bool prime;
    int b;
    int c = 1000;
    int counter = 0;
    int totalSum = 0;

    for (b = 1; b <= y; b++)
    {
        prime = isPrime (b);

        if (prime == true)
        {
            counter++;
        }
        if (b == c)
        {
            cout << setw(10) << left << (b - 999) << setw(10) << left << b << setw(12) << counter << endl;
            cout << fixed << showpoint << setprecision(2) << endl;
            totalSum = totalSum + counter;
            counter = 0;
            c = c + 1000;
        }
    }

现在,我认为x和y是形式变量,但我不知道x应该代表什么。它代表int c;吗?该函数中的for循环让我很困惑。我不明白。任何可以照亮的光都会受到赞赏。

至于平方根查询,我是否需要使用3个嵌套for循环来获得素数?像这样:

 for (a > m => b)

  for (a==m => b==m)

    for (a < m => b>m)

以这种方式定位素数会比这里所示的方式更复杂或更复杂吗?我知道要解决这个问题很多。如果你们建议我把它分成不同的帖子,我会编辑这个帖子并将后半部分发布在不同的帖子中。谢谢你的帮助!只是一个新手C ++程序员试图从这些东西中做出正面和反面:)

2 个答案:

答案 0 :(得分:1)

第一个函数isPrime()完成它应该做的事情。如果数字是素数,则返回true,否则返回false。循环变量a仅运行到n/2的原因是因为任何数字n都不能具有大于n/2的因子(除了它自身)。例子? 6 -- 1, 2, 3 and 612 -- 1, 2, 3, 4, 6 and 12。循环只是试图查看a是否有任何因素(数字除以它而不留下余数)。如果是,它不是素数(return false),否则它是(return true)。

但我觉得primeCount()并没有完全按照预期行事。

根据primeCount()的定义,我认为它的目的是计算从xy的素数总数(在您的情况下为2到50000,因为您提到了{{ 1}}调用main())。但是,要执行此操作,必须将primeCount(2, 50000)循环更改为此

for

此处变量for (b = x; b <= y; b++)的作用是检查循环变量c的每千个值。

请注意,在第一次运行时,bb = 1000程序会打印到目前为止遇到的素数(b == c)。之后,counter重置为counter0现在为c。然后,2000b转到1001并且同样的事情重复,直到2000为50000。

总体而言,我们的目标是打印从b2的每1000个自然数中存在的素数。

答案 1 :(得分:0)

for (a = 2; a <= (n / 2); a++)
{
    if ((n % a) == 0)
    {
        return false;
    }

}

这是您使用的“for”循环。它在除以每个“a”时检查n的余数,从2迭代到n /(n的一半(整数除))。如果这些余数中的任何一个为零,则n是一个复合,并且没有必要继续前进。我们只是返回一个假 - 这个数字不是素数。

可以安全地假设,如果我们在(n / 2)之前没有找到n的除数,那么这个数字是素数,所以在我们尝试所有可能的除数猜测之后,如果我们得到那么远,我们就会返回数字是素数。