-4

第一个程序

#include<stdio.h>

void main()
{
    int n,c;
    printf("enter a numb");
    scanf( "%i", &n);

    for( c = 2; c <= n; c++){
        if( n % c == 0 )
            break;
    }

    if( c == n )
        printf("\nprime\n");
    else
        printf("\nnot prime\n");
    getchar();
}

第二个项目

#include "stdio.h>

int main()
{
    printf("Enter a Number\n");
    int in, loop, rem, chk;
    scanf("%d",&in);

    for ( loop = 1; loop <= in; loop++){
        rem = in % loop;
        if( rem == 0)
            chk = chk +1;
    }
    if ( chk == 2 )
        printf("\nPRIME NUM ENTERED\n");
    else
    printf("\nNUM ENTERED NOT PRIME\n");
    getchar();
}

第二个程序可以工作,但第一个是我朋友写的,程序看起来不错,但是通过单步检查它,我们发现if第一个程序中的条件在每个输入下都成立,所以这里的逻辑错误是什么,请帮忙我发现了……

4

3 回答 3

3

如果我们谈论的是第一个程序,那么读取整数 n 的方式就有问题。你需要传递它的地址:

printf("enter a numb");
scanf("%i",&n);

我很惊讶您的编译器没有捕捉到这一点。

于 2012-11-25T11:00:58.143 回答
2

这种情况在第一个是错误的:

       for(c=2;c<=n;c++)

你必须去到 n/2。在您的情况下,条件始终为真,因为当 c == n 时 n % c 等于 0 并且您达到了休息时间。

素数的定义是它唯一的除数是 1 和它自己。

所以正确的 for 语句是:

for (c = 2; c < = n / 2; c++)

编辑:

事实上,在达到 trunc(sqrt(n)) 之后,应该不会再有除数了。

     for (c=2; c < trunc(sqrt(n)) c++)
于 2012-11-25T10:57:13.940 回答
1

你的程序逻辑是正确的。问题出在您的 scanf 语句中...您需要传递变量的地址。它应该是 :scanf("%i",&n);

于 2012-11-25T11:08:03.230 回答