这个小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),这显然不是一个主要的... 但是:程序告诉我它是!?
我错过了什么......?
答案 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的值。