晚安,我不是C ++专家。我需要计算3和极限内的双素数。我的输出始终为1.我在做什么错?这也是我使用AKS的算法!
#include <bits/stdc++.h>
using namespace std;
long long c[100];
void coef(int n)
{
c[0] = 1;
for (int i = 0; i < n; c[0] = -c[0], i++) {
c[1 + i] = 1;
for (int j = i; j > 0; j--)
c[j] = c[j - 1] - c[j];
}
}
bool isPrime(int n)
{
coef(n);
c[0]++, c[n]--;
int i = n;
while (i-- && c[i] % n == 0)
;
return i < 0;
}
int main()
{
int limit=10000,counter=1,i;
for(i=3;i<=limit;i+=2){
if (isPrime(i)){
if(isPrime(i+2)){
counter++;
}
}
}
cout <<counter;
return 0;
}
我在Windows 10 Pro上的代码块17.02上。我在做什么蠢事?
答案 0 :(得分:0)
这不是素数的AKS算法的全部。它看起来像RosettaCode task的略微修改版本,它实现了指数时间引理。这将比简单的试验划分要慢,更不用说没有模块化算法,这种实现基本上是没有用的,因为它甚至会在玩具大小的输入上溢出。
一旦您进行了适当的素数测试,要考虑的一件事就是不要一遍又一遍地在相同的输入上调用isprime()。您可以每个号码拨打一次,并且只记得您找到的上一个素数。如果isprime(i)为true,则计算您找到的最后一个是否为i-2。现在,您不需要重复调用,也不需要值数组。
更好的是,因为要生成n的所有素数,所以要使用筛子。即使使用更好的素数测试,该任务比素数测试效率更高。您可以在RosettaCode page for that task上找到普通的C版本。那里有更好的,但是考虑到您的开始,这实际上并不重要。