为什么素数检查得到大数字的错误结果?

时间:2012-01-09 16:37:55

标签: c primes

这个小C脚本会检查一个数字是否为素数...不幸的是它不能完全正常工作。我知道脚本效率低下(例如sqrt优化),这些都不是问题。

#include <stdio.h>

int main() {
  int n, m;

  printf("Enter an integer, that will be checked:\n"); // Set 'n' from commandline
  scanf("%d", &n); // Set 'n' from commandline

  //n = 5; // To specify 'n' inside code.

  for (m = n-1; m >= 1; m--) {
    if (m == 1) {
      printf("The entered integer IS a prime.\n");
      break;
    }
    if (n % m == 0) {
      printf("The entered integer IS NOT a prime.\n");
      break;
    }
  }
  return 0;
}

我用很多数字测试了程序并且它工作了...然后我尝试了一个更大的数字(1231231231231236),这显然不是一个主要的... 但是:程序告诉我它是!?

我错过了什么......?

3 个答案:

答案 0 :(得分:6)

数字“1231231231231236”太大,无法容纳“int”数据类型。添加一个printf语句来显示你的程序认为你给它的号码,如果这是最好的,你的程序运行正常;否则,您可能遇到值得检查的问题。添加对仲裁大小整数的支持需要相当多的额外努力。

你遇到这个问题的原因是像int这样的内部数据类型有一个固定的大小 - 对于int来说可能是32位或4个字节。鉴于此,int类型的变量只能代表2 ^ 32个唯一值 - 大约40亿。即使你使用unsigned int(你不是),int类型也不能用于存储大于40亿的数字。你的数字比那个大几个数量级,因此,当你试图将你的输入放入int变量时,会发生一些事情,但我可以告诉你不会发生什么:它没有被赋值1231231231231236

答案 1 :(得分:1)

很难知道没有更多细节,但是如果你的int是32位,那么你传递的值超出了允许的范围,毫无疑问它将被表示为除了你的值之外的东西过去了。您可能需要考虑使用unsigned int。

答案 2 :(得分:1)

给定的数字对于C中的整数来说太大了。可能它只接受了它的一部分。尝试打印n的值。