アプリ版:「スタンプのみでお礼する」機能のリリースについて

繰返し素数判定を行ない、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);
}

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

A 回答 (2件)

#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);
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/06/04 19:02

★アドバイス


・素因数分解するアルゴリズムを整理した方が良い。
(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
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/06/04 19:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!