#include <stdio.h>
int main()
{
int i, n, c, p;
printf("enter\n");
scanf("%d", n);
c = find(n);
if (c == 1)
{
printf("no. is not prime");
}
else
{
printf("no. is prime");
}
}
find(int n)
{
int i = 2, p;
while (i < n)
{
p = n % i;
printf("value of p%d", p);
if (p == 0)
{
return 1;
}
i = i + 1;
}
return 2;
}
.................................... 上面的程序让我不是素数&#39;所有输入的输出...... p的值总是为零,这不应该是这种情况...... 请帮忙...严重卡住......
答案 0 :(得分:3)
您的scanf()
来电必须使用n
的地址。此外,对于小于2的数字,primality测试失败。最好将非零返回true,否则返回零,以便可以使用if
直接测试该值。你应该找到一个比find
更好的名字。
尝试这样的事情:
#define TRUE 1
#define FALSE 0
int is_prime (int n)
{
int i;
if (n < 2)
return FALSE;
for (i = 2; i < n; i++) {
if (n % i == 0) {
return FALSE;
}
}
return TRUE;
}
int main()
{
int n;
printf ("enter number: ");
scanf ("%d", &n);
if (is_prime (n)) {
printf ("number is prime.\n");
}
else {
printf("number is not prime.\n");
}
return 0;
}
可以进行各种改进,但我希望尽可能接近您的代码。
答案 1 :(得分:0)
这看起来像是学生练习,所以让我首先建议调试器是你的朋友。 :)
话虽如此,您可能需要查看Sieve of Eratosthenes和leverage Wikipedia以获取一些优秀测试内容的来源。
正如已经建议的那样,有很多潜在的改进...我会修改你的“查找”功能,使其更加清晰如下:
bool IsPrime(unsigned int n)
{
unsigned int nCounter = 2;
while (n % nCounter++);
return (nCounter > n);
}
Prime不能是否定的,因为你问的是“TRUE / FALSE”问题,名称和返回类型应该强制执行该合同。
答案 2 :(得分:0)
几个问题:
scanf("%d", n);
应为scanf("%d", &n);
- 您需要传递n
的地址,以便scanf
可以对其进行更新(请注意你冒着运行时错误的风险,
因为n
的值很可能不是有效的地址值);
从C99标准开始,不再支持find(int n) {...}
等函数的隐式输入,从一开始就不是好习惯。您应该(对于C99及更高版本,必须)在函数声明和函数定义 - 中提供类型说明符以及函数名称 - { {1}};
与2类似,在函数调用之前,函数声明必须可见;实现此目的的最简单方法是将函数 definition 移到int find( int n ) {...}
的定义之上。如果您不想这样做,那么您需要在调用main
之前的某处添加声明int find(int n);
。
请注意,您可以通过几种方式加速素性测试。首先,您可以跳过针对偶数因素的测试;如果一个数字可以被2的倍数整除,那么它可以被2整除,你就已经检查过了。其次,您不需要测试所有因子find
;你只需要测试直到n - 1
的平方根的因子。你可以像这样把所有这些放在一起:
n