繰り返し素数判定プログラムとは?

このQ&Aのポイント
  • 繰り返し素数判定プログラムは、自然数が素数であるかどうかを判定するプログラムです。
  • 通常の素数判定プログラムを繰り返し実行し、Ctrl-Dで終了させることができます。
  • 繰り返し素数判定プログラムの作成方法やその使い方について詳しく解説します。
回答を見る
  • ベストアンサー

素数判定の繰返し

繰返し素数判定を行ない、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); } これは訳わからないことになっちゃいます。。。 どうしたらいいんでしょうか??

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

  • ベストアンサー
  • DT200
  • ベストアンサー率38% (63/164)
回答No.1

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

horininnna
質問者

お礼

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

その他の回答 (1)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.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
horininnna
質問者

お礼

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

関連するQ&A

  • 素数を判定するプログラム

    素数を判定するプログラムをC言語で作れという問題があったのですが、以下のものをビルドして実行したら途中で止まってしまいました。(例えば5と入力する)しかし、1以下の場合は正常にif文が評価されました。 // homework4.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include <stdio.h> int main(int argc, char* argv[]) { int number; int n; int i; printf("1より大きい整数を入力してください: "); scanf("%d", &number); if (number <= 1) { printf("1より大きい整数を入力してください\a: "); scanf("%d", &number); } for (n = 2; n = number - 1; n++) { i = number % n; if (i = 0) { printf("%dは素数ではありません", number); break; } } printf("%dは素数です", number); return 0; } 自分ではどこがおかしいのかさっぱりわかりません。よろしくお願いします。

  • 素数を判定するプログラム

    整数をひとつ入力して、それが素数かどうかを判定するプログラムを作ったのですが、素数でないものを入力しても「素数です」といわれます。 どうもfor文が評価されていないような気がしますが、原因がわかりません。 // homework4.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include <stdio.h> int main(int argc, char* argv[]) { int number; int n = 2; int i; printf("1より大きい整数を入力してください: "); scanf("%d",&number); while (number <= 1) { printf("1より大きい整数を入力してください: "); scanf("%d",&number); } if (number == 2) { printf("%dは素数です\n",number); goto OUT; } else { for (; n == number - 1; n++) { i = number % n; if (i == 0) printf("%dは素数ではありません\n", number); if (i == 0) goto OUT; } } printf("%dは素数です\n", number); OUT: return 0; } どうかよろしくお願いします。

  • 2進→10進数

    2進数から10進数に変換するプログラムを作りたいんですが #include<stdio.h> main() { int a[8],i=0,ans=0,end; start: printf("2進数を10進数に変換するプログラム\n開始する場合は1を入力終了する場合は0を入力してください。\n"); scanf("%d",&end); if(end==1) { goto s1; } else if(end==0) { goto end; } { s1: for(i=0;i<8;i++) { scanf("%d",&a[i]); } for(i=0;i<8;i++) { a[i]=2^i; } for(i=0;i<8;i++) { ans=ans+a[i]; } printf("二進数"); for(i=8;i<=4;i--) { printf("%d",a[i]); } printf(" "); for(i=4;i<=0;i--) { printf("%d",a[i]); } printf("は%dです。\n",ans); goto start; } end: printf("終了します\n"); } 期待した結果が得られないのですがどこが違っているのか教えていただきたいです、お願いします。

  • 打ち込んだ数字が素数かどうか判断するプログラム

    数字をキーボードから入力し、その数字が素数がどうかを判断するプログラムを打ちたいのですが、うまくできません。 コンパイルはできるのですが…。 どなたか間違っているところを教えてください。 #include<stdio.h> int main ( void ) { int a,b,indicator=1; printf("正の整数:"); scanf("%d", &a ); /* indicator=1.......素数でない indicator=0.......素数である */ if(a<=1){ indicator=1; } else { for(b=2;b<=(a-1);b++) { if(a%b == 0){ indicator=0; } } if(indicator==1) { printf("%dは素数ではありません\n",a); } else if (indicator==0) { printf("%dは素数です\n",a); } } return 0; }

  • C言語 繰り返しの問題

    C言語の初心者です。 キーボードから値を入力して、1から入力された値までの奇数の和を求めて出力するプログラムを作成します。以下のように組んでみましたが、全然うまくいきません。誰か教えていただけませんか? #include<stdio.h> int main(void) { int i,n,sum; sum=0; printf("入力値:",n); scanf("%d",&n); if(n<=0) { printf("\n合計値:0\n"); } else { printf("入力値:\n",n); for(i= 1; i<= n; i=i+2) { if(n%2=1) { sum=sum+i; } } } printf("\n合計値\n",sum); }

  • 2つの自然数を入力しその間にある素数を表示する

    2つの自然数を入力して、その間にある素数を表示するプログラムです。 #include <stdio.h> main( ) { int a,b,c,i,j; printf("Input number 1:"); scanf("\n%d",&a); printf("Input number 2:"); scanf("\n%d",&b); if(a>b){ c=a; a=b; b=c; } for(i=a;a<b+1;i++){ for(j=2;j<i-1;j++){ if(i%j!=0){j++;} else{ if(i=j){ printf("\n%d",i); } } } } } i=aからbまで j=2からi-1まで iはjで 割り切れるか NO→(jを1つ増やす) YES→iはjと等しいか YES→iの値を表示 NO→(iを1つ増やす) END この部分がよくわかりませんfor文を使うんですか? ご指導お願いします。

  • C言語について

    次のような問題です。 問 自然数nを入力し、nを3で割って割り切れるかどうかを判定し結果を表示する。「割り切れる」、「1余る」、「「2余る」のいずれかが入るものとする。 このようなものをつくりました。 #include<stdio.h> int main(void) { int n; printf("自然数:"); scanf("%d",&n); if(n==0){ printf("割り切れる\n"); }else if(n==1){ printf("1余る\n"); }else{ printf("2余る"); } return(0); } これで合っているかよろしくお願いします。

  • if~else文の中にまたif~else文をいれるには。

     このプログラムを思うように実行したいのですが、できません。 コンパイルはできるのですが、警告が4つほど出て、結果も自分が思ってるのとは違います。 プログラムのどこを改善すべきか教えてください。 OSはWindows XPで、コンパイラはボーランドのフリーコンパイラを使用しています。 #include<stdio.h> int main(){ int a,b,c,d; printf("1か0を入力してください。\n"); scanf("%d",&a); if(a=0) { printf("2か3を入力してください。\n"); scanf("%d",&b); if(b=2){ printf("今まで合計は%dです。\n",a+b); } if(b=3){ printf("今まで合計は%dです。\n",a+b); } else { printf("指定した数字を入力して下さい。\n"); } } else if(a=1) { printf("あなたは%dを入力しました。\n",a); } else { printf("指定した数字を入力してください。\n"); } return 0; }

  • プログラムが上手く動作しません。

    質問です。 1.整数を1個入力し、その数を3で割った余りが0ならば"Good morning"、1ならば"Good evening"、2ならば"Good afternoon"と出力するプログラムを作成せよ。ただしswhitc文を用いること。 という問題で私は #include <stdio.h> main() {      int a;      printf("整数a:");      scanf("%d",&a);      switch(a%3)      {      case '0':           printf("Good morning \n");           break;      case '1':           printf("Good evening \n");           break;      case '2':           printf("Good afternoon \n");           break;      } } と考えましたが実行しても入力はできますがprintfが表示されません。 どこが間違っているのでしょうか?ちゃんとコンパイルはできるのですが・・・。 2.10個の整数値をキー入力し、合計と平均値を計算してその結果を表示するプログラムを書きなさい。 #include <stdio.h> main() {      int a[11],b,c,i;      for(i=1;i<11;i++)      {           printf("整数%d:\n",i);           scanf("%d",&a[i]);      }      for(i=1;i<11;i++)           b+=a[i];      c=b/10;      printf("合計値は%d",b);      printf("平均値は%d",c); } というプログラムを考えましたが、計算結果がめちゃくちゃになってしまいます。 これもどこを直したらいいべきでしょうか?

  • scanf関数について

    scanfで数字を入力し「CTRL+D」で入力終了となるプログラムを考えています. 調べてみると以下の様なプログラムでは入力終了となります. #include <stdio.h> int main(void) { int a[256]; int i = 0; while(1) { printf("Input%d = ", i); if ( scanf("%d", &a[i]) == EOF || i > 255) { break; } i++; } return 0; } しかし,次の様にすると「CTRL+D」では終了しません. #include <stdio.h> int main(void) { int a[256]; int i = 0; while(1) { printf("Input%d = ", i);   scanf("%d", &a[i]); <-----追加 if ( a[i] == EOF || i > 255) {   <-----変更 break; } i++; } return 0; } この場合は,環境がUNIXのため「-1」と入力すると終了します. 2種類の違いが分かりません. 教えてもらえないでしょうか?

専門家に質問してみよう