如何通过C ++中的位操作找到素数?

时间:2009-05-22 16:23:42

标签: c++ math primes

如何通过C ++中的位操作找到素数?

4 个答案:

答案 0 :(得分:12)

尝试使用bitset实现prime sieve。该算法只需要存储某个数字是否为素数。一点就足够了。

答案 1 :(得分:12)

我认为这样做的方法是不要像我们通常那样将bitset视为其数值表示,而是将其视为数字列表。所以bitset

1111

代表数字1,2,3和4.现在,如果我们说'1'代表素数而'0'代表素数,我们可以按如下方式筛选。

将所有位设置为1(我将使用代表整数1到16的16位)

1111 1111 1111 1111

我知道一个不是素数,所以我把它设置为零。

0111 1111 1111 1111

现在,我知道我遇到的下一个'1'代表一个素数,但是这个数字的所有倍数都是按照定义而不是素数,所以我只留下下一个'1',但是设置它的所有倍数都为'0'。由于下一个'1'代表数字2,因此我每隔一位为零。

0110 1010 1010 1010

这种方法优于其他方法的好处是,当我遍历其余位时,我不需要检查每个位以查看它是否可以被2整除(因此不需要像if i % 2 == 0那样)。我可以继续将指数递增2,我知道我将永远落在非素数上。

现在我只是在我遇到的下一个'1'时再次做同样的事情(从我确定的最后一个素数开始的下一个素数,2)。我知道这是最好的,因为它不能被它下面的任何数字整除。我知道它的所有倍数都是素数,因此它处于第三位,我将后面的每三位设置为'0'。其中一些已经是'0',因为它们也是2的倍数。没关系,只需将它们保留为0即可。

0110 1010 0010 1000

你遇到的下一个'1'是第五位。现在你可以继续前进,直到你到达终点,但由于5大于我开始时的位数的平方根,我知道我不会再找到任何复合材料,所以我已经完成了。


经过一番搜索后,我在Deitel& amp;找到了一个非常好的实现示例。 Deitel的C++ How to Program。它们还提供了对算法和代码的良好解释。

答案 2 :(得分:0)

我发现了这个c#代码,我相信你可以很好地阅读它。

using System;
using System.Collections.Generic;
using System.Text;

namespace eratosthenes
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = 100;
            bool[] primes = new bool[n];
            for (int i = 2; i < n; i++) {
                primes[i]=true;
            }

            for (int i = 2; i < n; i++) {
                if (primes[i] == true) {
                    for (int j = i * i; j < n; j=j+i)
                    {
                        primes[j] = false;
                    }
                    Console.WriteLine(i);
                }
            }
            Console.ReadLine();
        }
    }
}

指向german wikibooks page的链接。

答案 3 :(得分:-1)

如果你不知道,那么从别人那里得到答案就是作弊,不是吗?告诉那个你不认识的人。在面试中不知道每个问题都没关系。看起来作弊或复制的东西比说“我不知道”更糟糕。解释你如何知道素数是什么,解释素数的一些属性并解释你对位操作的了解。如果你不了解这些事情,那么这项工作可能不适合你吗?