2015-12-17 59 views
-1
#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; 
} 

.................................... 上面的程序给我所有的输入不是素数'输出...也是p的值总是零,这不应该是这样的... 请帮助...严重卡住...素数错误输出

+2

当你编译这段代码时,你会得到任何警告吗?我做 。 。 。 – davejagoda

+0

你有什么试图调试你的程序?你尝试过调试器吗?你有没有尝试'printf'来测试'n'的值是否等于你实际输入的值? – lurker

+0

你需要'scanf(“%d”,&n);'来实际读取一个值 –

回答

3

您的致电scanf()致电地址必须为n。此外,对于小于2的数字,您的素数测试将失败。另外,还可以将非零值返回为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; 
} 

各种改进是可能的,但我想留接近你的代码越好。

+0

感谢让我认识到我的愚蠢的错误... –

0

这看起来像一个学生练习,所以我首先建议调试器是你的朋友。 :)

说了这么多,你可能想要查看Sieve of Eratosthenesleverage Wikipedia以获得一些好的测试内容的来源。

前面已经提出,有潜在的改进负荷......我会修改你的“查找”功能更清晰如下:

bool IsPrime(unsigned int n) 
    { 
     unsigned int nCounter = 2; 

     while (n % nCounter++); 

     return (nCounter > n); 
    } 

总理的不能为负数因为你”再问一个“TRUE/FALSE”问题,名称和返回类型应强制执行该合同。

0

几个问题:

  1. scanf("%d", n);应该是scanf("%d", &n); - 你需要通过地址n所以scanf可以更新它(注意,因为n的价值风险运行时错误, 最可能不是有效的地址值);

  2. 从C99标准开始,不再支持对诸如find(int n) {...}之类的函数的隐式类型的支持,并且从头开始从来都不是好习惯。你应该(和C99后来,必须)在这两个函数提供一个类型说明符函数名以及声明和功能定义 - int find(int n) {...};

  3. 类似2,前一个功能是称为功能声明必须是可见的;完成此操作的最简单方法是将函数的定义移到main的定义之上。如果你不想这样做,那么你需要在调用find之前的某处添加声明int find(int n);

请注意,您可以通过几种方法加速素性测试。首先,你可以跳过对偶数因素的测试;如果一个数字可以被2整除,那么它可以被2整除,并且你已经检查过了。其次,你不需要测试高达n - 1的所有因素;您只需要测试直至n的平方根的因子。你可以像这样把所有的东西放在一起:

if (n < 2) 
    return 0; // zero indicates false 

if (n == 2) 
    return 1; // non-zero indicates true 

int result = n % 2; 
for (int i = 3; result && i * i <= n; i += 2) // loops as long as result 
    result = n % i;        // is non-zero, only tests 
               // against odd numbers up to 
return result;         // sqrt(n)