- ベストアンサー
C言語の問題
以下はC言語の問題です。お教えください。 1000以下の素数を求めるプログラム prog.c を作成せよ。各素数を整数4桁で出力し、15個の素数を出力した時点で改行処理 を行うこと。作成したプログラムを提出せよ。 です。 僕の考えでは、 #include <stdio.h> #include <math.h> main(){ int i; int j; int ix; int k; printf("正の整数を入力して下さい: "); scanf("%d",&i); ix=(int)(sqrt((double)i)); k=0; for(j=2;j<=ix;j++) { if(i%j==0) { k=1; } } if(k==0) { printf("%d は素数です\n",i); } else { printf("%d は素数ではありません\n",i); } となると思うのですが。どうやら違うようです。全然わからないので、正しい答えを教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>1000以下の素数を求める 【1】 >各素数を整数4桁で出力 【2】 >15個の素数を出力した時点で改行処理 【3】 質問者様のソースには、上の「仕様」が全然満たされていませんが・・・。 暇な年寄りは、配列を用いず、 #include <stdio.h> int HiSosuuHantei( int iVal ) { int iSoinsu, iHambun; iHambun = iVal / 2; for( iSoinsu = 2; iSoinsu <= iHambun; iSoinsu++ ){ if( 0 == ( iVal % iSoinsu ) ) return( 1 ); // 非素数 } return( 0 ); // 素数 } void main() { int iVal, iCnt = 0; for( iVal = 2; iVal <= 1000; iVal++ ){ //【1】 if( HiSosuuHantei( iVal ) ) continue; iCnt++; printf( "%4d", iVal ); //【2】 if( 0 == ( iCnt % 15 ) ) printf( "\n" ); //【3】 } } とします(タブの代わりに全角空白使用)。
その他の回答 (4)
コーディング例です。 main関数内で全部済ませようとせずに、機能毎に細分化を行うべきです。 #include <stdio.h> #include <stdlib.h> /* 整数nは素数か判定 @param n 判定対象整数 @return 真偽値 (注)素数を求めるより良い方法がありますので、 知っているならばそちらを使うべきです。 */ int is_prime(int n) { if(n <= 1) return 0; int i; for(i=2 ; i<=n/2 ; i++) { if(n % i == 0) return 0; } return 1; } /* 素数列を得る @param ps 素数列を格納する配列 @param upper 探索範囲上限 */ void get_primes(int* ps , int upper) { int i; int j = 0; for(i=2 ; i<=upper ; i++) { if(is_prime(i)) { ps[j] = i; j++; } } ps[j] = 0; // 終端目印 } /* 素数列を表示 @param ps 素数列が格納された配列 */ void disp_primes(int* ps) { int i; int nl; for(i=0 , nl=0 ; ; i++) { if(ps[i] == 0) break; nl++; printf("%4d" , ps[i]); if(nl % 15 == 0) printf("\n"); } printf("\n"); } int main(void) { int* primes = (int*)malloc(sizeof(int) * 1000); get_primes(primes , 1000); disp_primes(primes); free(primes); return 0; }
- cametan_42
- ベストアンサー率62% (162/261)
参考までに。 C言語は良く分からないんで、Common Lispで書いてみました。 (基本的にリストが二つ必要なアルゴリズムらしいので、Lispの方が向いてる、と思いました。C言語だったら配列が必要なんじゃないか、と思います。) ;;ここからソース。エラトステネスの篩と呼ばれるアルゴリズム (defun eratosthenes (n) (labels ((foo (i ls) ;局所関数fooを定義。2~nまでのリストを作る。 (if (= i 1) ls (foo (1- i) (cons i ls)))) (spam (ls0 ls1) ;局所関数spamを定義。 (if (> (expt (car ls1) 2) (car (last ls0))) (append (reverse ls1) ls0) ;ここで脱出。 (let ((ls2 ;modを使って素数要素の倍数を消去。 (remove-if #'(lambda (x) (zerop (mod x (car ls1)))) ls0))) (spam (cdr ls2) (cons (car ls2) ls1)))))) (let ((lst (foo n nil))) ;局所関数呼び出し。 (spam (cdr lst) (list (car lst)))))) ;; ここまで。 出力までは弄りませんでしたが、引数nを与えればそのnまでの素数を返してくれます。 ;; 実行例 [1]> (eratosthenes 1000) (2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521 523 541 547 557 563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 647 653 659 661 673 677 683 691 701 709 719 727 733 739 743 751 757 761 769 773 787 797 809 811 821 823 827 829 839 853 857 859 863 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977 983 991 997) ;; ここまで。 Common Lispはフリーウェアとして配布されているので、一回上のソースを試してみてください。 例:Clisp http://clisp.cons.org/ アルゴリズム自体はWikipediaに書かれていますので、それでも参考にしてください。
- wolf03
- ベストアンサー率22% (241/1086)
C言語どうこうよりも、素数の求め方が間違っているのでは話になりません。 求めるための手順を考え、それを対象とする言語の文法に当てはめるのです。 まず、自分が手作業で求めるには如何するかを書き出します。 それを如何やったら機械的に出来るかを考えます。 考えがまとまったら対象言語の文法に合うように当てはめます。 答えが合っていれば完了、間違っていれば二番目からやり直しです。 どうして合わない場合、手作業の時に間違いがある場合もあります。
- sakusaker7
- ベストアンサー率62% (800/1280)
>全然わからないので、正しい答えを教えてください。 これはダメ。 > どうやら違うようです。 ちゃんと問題の意味を把握できてますか? 問題には > 1000以下の素数を求めるプログラム prog.c を作成せよ。 > 各素数を整数4桁で出力し、15個の素数を出力した時点で改行処理 を行うこと。 とあるのだから、1000以下の整数すべてについて素数かどうかのチェックを しないといけないでしょ? その上で4桁になるように出力するのと、 15個出力するごとに改行するってのを考えればいいんじゃないかな。