【发布时间】:2013-10-26 15:27:28
【问题描述】:
所以我正在尝试创建一个函数,该函数将返回 1 或 0,具体取决于给定数字是否为质数。
注意:我确定给定的数字是自然的。大于 1
我原来的功能:
int Prime(int a) {
int i;
for (i = 2; i*i <= a; i++)
{
if ((a % i) == 0)
return 0;
};
return 1;
}
工作得很好,但不知何故……慢。我正在寻找一种更有效的算法,而不使用数组。我的第二次尝试:
int Prime(int a) {
int i;
if (a == 2)
return 1;
if ((a % 2) == 0)
return 0;
for (i = 3; i*i <= a; i = i + 3)
{
if ((a % i) == 0)
return 0;
};
return 1;
}
结局很糟糕。有一些数字(我无法想象)小于MAX_INT,导致这个特定算法的工作非常缓慢。所以,我有两个问题:
我的升级算法有问题吗?
有没有什么方法可以更有效地完成这项任务?
【问题讨论】:
-
您可能想在 sqrt(a) 处停下来。
-
首先,您可能希望将
i*i存储在一个变量中,而不是为每次迭代计算它。 -
@Kunal 或者更确切地说用
-O2编译,它将由编译器完成。 -
您应该将 i = i + 3 更改为 i = i + 2。您可以将前两个 if 语句组合为: if (a % 2 == 0) return a == 2;
-
您可以对 2、7 和 61 运行 Miller-Rabin 测试:en.wikipedia.org/wiki/…
标签: c performance primes