当前位置: 首页 > 知识库问答 >
问题:

为什么我的埃拉托斯特尼代码筛无限循环。我用几个数字测试过

司空修贤
2023-03-14

我试图在C中实现埃拉托斯特尼的筛子算法,从下面的伪代码中:

输入:整数n

设A是一个布尔值数组,索引为整数2到n,最初都设置为真。

对于 i = 2, 3, 4, ..., 不超过 √n: 如果 A[i] 为真:对于 j = i2, i2 i, i2 2i, i2 3i, ..., 不超过 n: A[j] := 假。

输出:所有 i 使得 A[i] 为真。

然而,我的代码在最后一个for循环中无限循环,我不知道为什么。

void primes(int n)
{
    bool numArr[n];
    for (int a=2;a<n;a++)
       {
           numArr[a]=true;
       }
    int   k,j, m = int(sqrt(n));
    for(int i=2;i<m;i++)

    {
        k=0;
        if(numArr[i]==true)
        {
            for(j=i^2;j<n;j+(k*i))
            {
                numArr[j]=false;
                k++;
            }

        }

    }

    for(int j=1;j<n;j++)
    {
        if(numArr[j]==true)
        {
            cout<<numArr[j]<<endl;
        }
    }

}

共有1个答案

韩瀚
2023-03-14

首先,C语言中没有VLA。尽管如此,一些编译器还是会容忍它们,其他编译器则不会。对于便携式解决方案,std::vector非常有效。将您的VLA替换为:

std::vector<bool> numArr(n);

您甚至可以将初始化放入其中。不需要将所有内容设置为true的循环,只需将numArr(n)更改为numArr(n, true),一切都为您完成。

但是,您的主要问题就在这里:

for(j=i^2;j<n;j+(k*i))

j=i^2并没有做你认为它做的事情,你的j(k*i)增量也没有增加任何东西。实际上,k部分没有意义。改为这样做:

for (j = i*i; j < n; j += i)

您的< code>cout打印

虽然这不是问题,但你不必写如果(numArr[i] == true)。只需执行如果 (数字 [i]) 代替。数字[i]已经是一个布尔。

 类似资料:
  • 我正在尝试编写一个程序来实现对埃拉托西的筛选。我可以从2到任何给定的结束编号,但我们正在处理的赋值要求我们输入起始值。我完全被卡住了。我试过很多不同的代码,但它总是给我奇怪的答案。 我的起点是起始值,终点是结束值。我基本上想找到这个范围的素数。谢谢!!!

  • 做一个简单的筛子很容易: 但是当N非常大并且我无法在内存中持有这种数组时,该怎么办?我已经查找了分段筛方法,它们似乎涉及查找素数,直到sqrt(N),但我不明白它是如何工作的。如果 N 非常大(比如 10^18)怎么办?

  • 我在我的一个班级里做的一个作业,我们必须实现一个厄拉多塞的筛子。我已经尝试了七次来得到一个有效的代码,并且尝试了整合我研究过的许多解决方案。我终于有一个可以输出数字的了。不幸的是,它同时打印合数和质数,但不打印2。 我的代码如下: 我怀疑我的循环有问题。我修复了前两个循环的和变量,以便它从2开始打印出来,问题似乎是在我将数组初始化为true后,它没有将合数标记为。 提前感谢你的帮助。

  • 我正在尝试解决spoj上的Prime Path问题,我正在尝试理解在github上找到的解决方案。解决这个问题的广义逻辑是生成所有四位数素数,并添加一个边,如果我们可以通过更改一个数字从一个素数转到下一个素值。我找到的这个解决方案使用筛子来生成所有素数。与此解决方案中的筛分功能相比,维基上的稀土筛分功能有所不同。只需要帮助了解以下代码中筛分函数的变化: 这里的筛选函数计算是什么?我无法理解为什么作

  • 在一个类作业中,我被要求用Java编写Eratostenes筛选代码,我的代码效率非常低。运行时间不长,但我相当肯定,除了像我一样列出所有内容外,还有其他循环的空间。。 这是我的代码: 基本上,我所做的是将所有不是质数的元素设置为true… 所以我的主要2个问题是1。有没有办法实现一个循环,使代码更短2。如何打印此数组中所有为 true(质数)的元素

  • 我正在尝试实现本文Faster Sieve of Eratosthenes中描述的算法。我很理解这个想法,但我无法理解如何通过python代码实现它。 经过一些工作,我找到了一种将索引从筛子转换为数字本身的方法: 但主要问题是我在获得总理后必须做的跳跃。文章将其解释为: 6np±p,其中p是素数,n是一些自然数。 对于这样一个想法,有没有办法用最后发现的质数的指数来描述跳跃? 提前致谢。 附言。O