2

以下のコードは、ユーザーからの入力を読み取って、int [1-100] が素数かどうかを確認するものです。(範囲外の場合、「完了」と出力されます。素数でない場合は、それをコンソールに出力し、割り切れる数を出力します。

現在、このプログラムは 3 と 9 を除いて 1 から 10 に対して正しく実行されています... 何か提案はありますか?

#include <stdio.h>

int main()
{
    int num, i;
    printf("Number [1-100]:? \n");
    scanf("%d", &num);
    while(num>0 && num <101)
    {
        if (num==1||num==2)
            printf("Prime\n");
        for (i=2; i<=num/2; ++i)
        {
            if (num%i==0)
            {
                printf("Non-prime,divisible by %d\n",i);
                break;
            }
            else {
                printf("Prime\n");
                break;
            }
        }

        printf("Number[1-100]:? \n");
        scanf("%d",&num);
    }
    printf("Done\n");
}
4

3 に答える 3

3

まず、コードに適切な空白があることを確認してください。これは、物事が思ったように並んでいないときに気付くのに役立ちます.

#include <stdio.h>

int main()
{
  int num, i;
  printf("Number [1-100]:? \n");
  scanf("%d", &num);
  while(num>0 && num <101){
    if (num==1||num==2)
      printf("Prime\n");
    for(i=2; i<=num/2; ++i)
    {
      if (num%i==0)
      {
        printf("Non-prime,divisible by %d\n",i);
        break;
      }
      else {
        printf("Prime\n");
        break;
      }
    }
     printf("Number[1-100]:? \n");
    scanf("%d",&num);
  }
  printf("Done\n");
}

これで、else ステートメントが最初のチェックで発生することに気付くはずです。したがって、3 が 2 で割り切れない場合、「素数」と出力されます。

そして、それはループから抜け出します。

そして、これはすべての番号で発生します。プログラムが行っているのは、数値が 2 で割り切れるかどうかを確認することだけです。

「プライム」の代わりに「オッド」と書いた場合、少なくともそこは正しいでしょう。

これは、フラグを設定すると便利な種類の問題です (これを行う方法は他にもありますが、これは 1 つの方法です)。つまり、フラグを立てることができます。int isPrime = 1;

ここで、数が素数でないことがわかった場合は、単純に を設定しisPrime = 0;ます。

最後に、for ループの最後 (繰り返します: for ループが終了した後) で、その変数をチェックする必要があります。そして、あなたは言うことができます、

if (isPrime == 1)
{
  printf("Prime\n");
} else
{
  printf("Non-prime.");
}

除数を印刷する方法を理解させます:)

(参考までに、フラグを正しく使用すると次のようになります。明確にするために、フラグが継続的にループする「機能」を削除しました)

#include <stdio.h>

int main()
{
  int num, i;
  int isPrime = 1;
  printf("Number [1-100]:? \n");
  scanf("%d", &num);
  for(i=2; i<=num/2; ++i)
  {
    if (num%i==0)
    {
      isPrime = 0;
      break;
    }
  }
  if (isPrime == 1)
  {
    printf("Prime\n");
  } else
  {
    printf("Non-prime.");
  }
  printf("Done\n");
}
于 2013-09-12T21:35:12.627 に答える
0

2 から num/2 までの範囲全体をチェックしているわけではありません。while ループと素数フラグが必要です。このようなもの。

    while(num>0 && num <101)
    {

        unsigned char prime = 1;    // set prime flag
        i = 2;
        while( i < (num/2)+1)
        {
            if(num%i == 0)
                prime = 0;
                i++;
            }
            if(num == 1)
            prime = 0;

        if(prime == 0)
            printf("%d is nonprime\n", num);
        else
            printf("%d is prime\n", num);

       prime = 1;
       printf("Number[1-100]:? \n");
       scanf("%d",&num);
    }
于 2013-09-12T22:02:31.060 に答える