我试图提出一个方法,该方法接受一个整数并返回一个布尔值,以表明数字是否为质数,并且我对C的了解不多。有人愿意给我一些指示吗?
基本上,我会在C#中这样做:
static bool IsPrime(int number) { for (int i = 2; i < number; i++) { if (number % i == 0 && i != number) return false; } return true; }
OK,所以就不用C了。假设我给您一个数字,请您确定它是否是素数。你怎么做呢?清楚地写下步骤, 然后 担心将它们转换为代码。
确定算法后,您将更容易弄清楚如何编写程序,而其他人则可以帮助您。
编辑: 这是您发布的C#代码:
照原样,这 几乎是 有效的C。boolC中没有类型,no true或no false,因此您需要对其进行一些修改(编辑:Kristopher Johnson正确指出C99添加了stdbool.h标头)。由于某些人无权访问C99环境(但您应该使用一个!),所以让我们进行一次非常小的更改:
bool
true
false
int IsPrime(int number) { int i; for (i=2; i<number; i++) { if (number % i == 0 && i != number) return 0; } return 1; }
这是一个完全有效的C程序,可以满足您的需求。我们可以毫不费力地改善它。首先,请注意i始终小于number,因此检查i != number总是成功的。我们可以摆脱它。
i
number
i != number
同样,您实际上并不需要一直尝试除数number - 1;您可以在到达sqrt(number)时停止检查。由于这sqrt是浮点运算,并且会带来很多细微的差别,因此我们实际上不会进行计算sqrt(number)。相反,我们可以检查一下i*i <= number:
number - 1
sqrt
sqrt(number)
i*i <= number
int IsPrime(int number) { int i; for (i=2; i*i<=number; i++) { if (number % i == 0) return 0; } return 1; }
最后一件事;您的原始算法中有一个小错误!如果number为负数,零或一,则此函数将声称该数字为质数。您可能希望适当地处理它,并且可能希望使其number不带符号,因为您更可能只关心正值:
int IsPrime(unsigned int number) { if (number <= 1) return 0; // zero and one are not prime unsigned int i; for (i=2; i*i<=number; i++) { if (number % i == 0) return 0; } return 1; }
这绝对不是检查数字是否为质数的最快方法,但是它可以工作,而且非常简单。我们几乎不需要修改您的代码!