这个小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),这显然不是一个素数...但是:程序告诉我它是!?
我错过了什么......?
数字"1231231231231236"太大而不适合"int"数据类型.添加一个printf语句来显示你的程序认为你给它的号码,如果这是最好的,你的程序运行正常; 否则,您可能遇到值得检查的问题.添加对仲裁大小整数的支持需要相当多的额外努力.
你遇到这个问题的原因是像int这样的内部数据类型有一个固定的大小 - 对于int来说可能是32位或4个字节.鉴于此,int类型的变量只能代表2 ^ 32个唯一值 - 大约40亿.即使你使用unsigned int(你不是),int类型也不能用于存储大于40亿的数字.你的数字比那个大几个数量级,因此,当你试图将你的输入放入int变量时,会发生一些事情,但我可以告诉你不会发生什么:它没有被赋值1231231231231236 .