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