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

jan*_*iks 2 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Pat*_*k87 6

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

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