みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

素数判定の繰返し

繰返し素数判定を行ない、CtrlーDで終了するプログラムをつくっています。
まず繰返しなしの素数判定プログラムを作り

#include<stdio.h>
int main(void)
{
int a,i;
printf("自然数を入力:");
scanf("%d",&a);

if(a<=0)
printf("入力エラーです。\n");

else if(a==1)
printf("1は素数ではない。\n");

else{
for(i=2; i*i<=a; i++){
if(a%i==0)
break;
}

if(i*i>a)
printf("%dは素数です。\n",a);

else
printf("%dは素数ではない。\n",a);
}

return(0);
}

これはちゃんとできたのですがそれを繰り返すことができません。

#include<stdio.h>
int main(void)
{
int a,i;
printf("自然数を入力:");
scanf("%d",&a);

while((a=getchar())!=EOF){

if(a<=0)
printf("入力エラーです。\n");

else if(a==1)
printf("1は素数ではない。\n");

else{
for(i=2; i*i<=a; i++){
if(a%i==0)
break;
}

if(i*i>a)
printf("%dは素数です。\n",a);

else
printf("%dは素数ではない。\n",a);
}

printf("自然数を入力:");
scanf("%d",&a);

}
printf("プログラムを終了します。\n");

return(0);
}

これは訳わからないことになっちゃいます。。。
どうしたらいいんでしょうか??

投稿日時 - 2007-06-04 17:51:55

QNo.3056410

すぐに回答ほしいです

質問者が選んだベストアンサー

#include<stdio.h>
int main(void)
{
int a,i;

// for文で無限ループを作る
for(;;){
printf("自然数を入力:");
//
// scanfはCTRL-DでEOFを返してくるので、ここでそれを判定し
// EOFであればbreakによりforループを抜ける。
//
if( scanf("%d",&a) == EOF ){
break;
}

//
// 後はオリジナルのままです
//
if(a<=0)
printf("入力エラーです。\n");

else if(a==1)
printf("1は素数ではない。\n");

else{
for(i=2; i*i<=a; i++){
if(a%i==0)
break;
}

if(i*i>a)
printf("%dは素数です。\n",a);

else
printf("%dは素数ではない。\n",a);
}
} // ここがforループの終端

//
// CTRL-Dでは改行されないので、文頭に改行コードを入れています。
//
printf("\nプログラムを終了します。\n");

return(0);
}

投稿日時 - 2007-06-04 18:08:26

お礼

ありがとうございます!!
できました(^0^)

投稿日時 - 2007-06-04 19:02:44

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

★アドバイス
・素因数分解するアルゴリズムを整理した方が良い。
(1)素因数分解する『数』を 2、3、4…と順番に割っていきます。
(2)割った余りが 0 以外ならば素因数の要素ではないと判定します。
 割る数に +1 してから(1)へジャンプ、繰り返します。
(3)割り切れたらばその数が素因数の要素になります。
 現在の素数でいくつ割れるかのカウンタに +1 して(2)へジャンプ、繰り返します。
(4)上記の(1)~(3)を繰り返します。そして、割った商が 1 になったら繰り返しを抜けます。
・ちょっと説明が下手ですのでサンプルを乗せておきます。

サンプル:
int main( void )
{
 int a; ←自然数
 int i; ←割る素数
 int exp; ←割れた素数のカウンタ値
 
 printf( "自然数を入力:" );
 scanf( "%d", &a );
  :
 /* 2 以下の処理を記述(マイナス値、1の処理) */
  :
 
 // 素因数分解を開始
 printf( "素因数分解⇒" );
 i = 2; ←素数の最初である 2 から計算開始
 
 do {
  exp = 0;
  
  while ( (a % i) == 0 ){ ←割り切れなくなるまで繰り返す
   a /= i;
   exp++; ←割り切れた回数をカウント
  }
  if ( exp > 0 ){
   printf( "%d^%d", i, exp ); ←表示(2*2*2 は 2^3 と表現)
   
   if ( a > 1 ){
    printf( " * " ); ←掛け算の * を表示
   }
  }
  i++; ←割る素数をインクリメント
 } while ( a != 1 ); ←割った商が 1 以上なら繰り返す
 
 printf( " です。\n" );
 return 0;
}

その他:
・サンプルでは最初に自然数を入力してその数を素因数分解して結果を表示します。
 720 の素因数分解は
 『素因数分解⇒2^1 * 3^1 * 4^1 * 5^1 です。』
 と表示されます。
・繰り返し部分と Ctrl-D で終了する部分は horininnna さんがプログラムして下さい。
・以上。

参考URL:http://oshiete1.goo.ne.jp/qa3022421.html

投稿日時 - 2007-06-04 18:25:37

お礼

素因数分解ではなくて素数判定なんです。。。
丁寧に説明していただきましたが申し訳ありません(^_^;)

投稿日時 - 2007-06-04 19:01:49