0

下面是素数的计算。我试图解构它以更好地理解循环。另外,我想通过将数字与其平方根进行比较来调整此函数以找到素数,而不是这样:

(假设在 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 整除(所以没有余数),则它不被视为素数(布尔返回 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++ 程序员 :)

4

2 回答 2

1

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

但是我觉得这primeCount()并没有完全达到预期的效果。

根据我的定义,我认为它是为了计算从到primeCount()的素数总数(在你的情况下是 2 到 50000,因为你提到了调用)。但是,要做到这一点,必须将循环更改为此xymain()primeCount(2, 50000)for

for (b = x; b <= y; b++)

这里变量的作用c是对循环变量的每千分之一值进行检查b

请注意,在第一次运行时,b = 1000b == c程序打印到现在为止遇到的素数数量(counter)。之后,counter重置为现在。0然后,从to继续,同样的事情重复,直到50000。c2000b10012000b

2总的来说,这个想法是打印从到的每 1000 个自然数中存在的素数的数量50000

于 2013-02-27T03:56:43.980 回答
0
for (a = 2; a <= (n / 2); a++)
{
    if ((n % a) == 0)
    {
        return false;
    }

}

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

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

于 2013-02-27T03:56:37.690 回答