-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();
}

2番目のプログラム

#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();
}

2番目のプログラムは動作しますが、最初のプログラムは私の友人が書いたもので、プログラムは正常に見えますが、ステップインして確認すると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 に答える