【问题标题】:C - how to test easily if it is prime-number? [duplicate]C - 如果它是素数,如何轻松测试? [复制]
【发布时间】:2011-07-13 23:58:01
【问题描述】:

可能的重复:
C - determine if a number is prime

有什么方法可以在 C 中轻松测试所选数字是否为素数?

【问题讨论】:

标签: c


【解决方案1】:

最简单的方法是写一个循环,比如:

int is_prime(int num)
{
     if (num <= 1) return 0;
     if (num % 2 == 0 && num > 2) return 0;
     for(int i = 3; i < num / 2; i+= 2)
     {
         if (num % i == 0)
             return 0;
     }
     return 1;
}

然后你可以优化它,迭代到floor(sqrt(num))

【讨论】:

  • 一个循环like,但最好不测试 0 或 1 作为因素 ;-p
  • 您可以进一步优化,首先检查num % 2,然后从 3 开始 i 并以 2 递增,因为您已经消除了所有偶数。
  • 有人说1也是素数...
  • @Vlad:在过去 100 年左右的时间里,这不是数学家的惯例,所以“一些”要么是逆向的,要么是死的。显然,如果您想使用“素数”的不寻常定义,那么您需要不寻常的代码。使用此代码,您还需要注意 is_composite(n) 如果应该为 1 提供正确答案,则不应将其实现为 !is_prime(n),因为 1 也不是复合的。
  • 前两行不应该是:if (num
【解决方案2】:

最快的方法是预先计算你感兴趣的范围内所有可能的整数的位数组(表示素数/非素数)。对于 32 位无符号整数,只有 512M,这将很容易适应现代地址空间(即使不适合,也将是快速的文件查找)。

这几乎肯定会比每次通过筛子计算要快。

【讨论】:

  • 并且在查表之前使用几行代码,内存可以减少到 256M,因为如果在查表之前进行奇偶校验,则不需要为偶数保留位.
【解决方案3】:

您可以尝试使用埃拉托色尼筛法:

http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

您很容易找到该算法的各种实现。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 2015-07-20
相关资源
最近更新 更多