素数的输出错误

时间:2015-12-17 17:27:49

标签: c if-statement output

#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的值总是为零,这不应该是这种情况...... 请帮忙...严重卡住......

3 个答案:

答案 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 Eratosthenesleverage Wikipedia以获取一些优秀测试内容的来源。

正如已经建议的那样,有很多潜在的改进...我会修改你的“查找”功能,使其更加清晰如下:

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

        while (n % nCounter++);

        return (nCounter > n);
    }

Prime不能是否定的,因为你问的是“TRUE / FALSE”问题,名称和返回类型应该强制执行该合同。

答案 2 :(得分:0)

几个问题:

  1. scanf("%d", n);应为scanf("%d", &n); - 您需要传递n地址,以便scanf可以对其进行更新(请注意你冒着运行时错误的风险, 因为n的值很可能不是有效的地址值);

  2. 从C99标准开始,不再支持find(int n) {...}等函数的隐式输入,从一开始就不是好习惯。您应该(对于C99及更高版本,必须)在函数声明和函数定义 - 中提供类型说明符以及函数名称 - { {1}};

  3. 与2类似,在函数调用之前,函数声明必须可见;实现此目的的最简单方法是将函数 definition 移到int find( int n ) {...}的定义之上。如果您不想这样做,那么您需要在调用main之前的某处添加声明int find(int n);

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

    n