- ベストアンサー
プログラムについて
次の問題が自分はどうでもできないので、皆さんに助けをお願いしたいのです。 問題は: N以下の素数を求めるプログラムと 試験の得点(0以上100以下の整数)を入力し,得点データの分布を10点刻 みのヒストグラムの形式で出力するプログラムが分かりません、ぜひ教え ていただきたいです。よろしくお願いします!
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
素数のC言語のプログラムは参考URLのところに載っています。
その他の回答 (3)
- fatal_error
- ベストアンサー率39% (23/58)
このいかにもな問題と「困り度3」、宿題ですか? えと、お使いのプログラミング言語は何でしょう? C/C++? JAVA? BASIC? COBOL? さらにはFORTLAN? 言語が判らないと具体的な回答はムリですが... N以下の素数の問題は、 ある数Xが素数なら、 Xより小さい整数(1は除く)では割り切れない、という性質を使って、 「1からNまで変数Aを変化させるループ」の中に、 「2からA(ルートAでいいんだけど)まで変数Bを変化させるループ」を作りさらにその中で、 「AはBで割り切れるか?」の条件分岐を作り、 「割り切れれば素数でない」と 「最後(AもしくはルートA)まで割り切れなかったら素数である」の ふたつの処理を書けばオッケーです。 また配列をご存知ならエラトステネスのふるい式に片付けるってのもテですが、 Nまで、ってなるとちょっと面倒です。 ヒストグラムの方は... 得点をどこから(キーボード、ファイルetc)、いくつ(10個、40個、N個etc) 入力するのか、の記述がないので答えようがありません。 「得点データの分布」は1個じゃ作れないでそれだけは判りますが。 あと、普通のコンソール(DOS上で動く)プログラムでヒストグラム、 ってのはちょっとつらいと思いますよ。(Visual Basicとか言うなら別ですが。) あと、この質問カテゴリが違うと思います。 理系の学問ではなく、 「コンピュータ&インターネット」の「プログラミング」の中が正解でしょう。 以上。不明な点があれば補足をどうぞ。
お礼
本当にいい勉強になりました、ありがとうございます。
- uni050
- ベストアンサー率26% (16/60)
学校の授業か何かならC言語での回答を求めておられるのでしょうがC言語は知らないのでfortranで例を述べさせて頂きます。 *program sosuu integer n,i,j,k /整数の宣言文 read(5,*) n /求めたい数nを読み込む。 write(6,*) 2 /始めの素数を書き出す。 do 10 j=3,n /判定される数jを3からnまでまわす。 do 11 i=2,j-1 /判定する数iを2からj-1までまわす。 k = j - int(j/i)*i /jをiで割った余りを求める。 if(k.eq.0) go to 10 /上記の余りが0ならば10へ飛び、次のjに移る。 11 continue write(6,*) j /jがj-1まで割り切れなければ素数と 判定し書き出す 10 continue stop end こんな所ですかね。参考程度にしてください。
お礼
ありがとうございます、勉強になりました!
- starflora
- ベストアンサー率61% (647/1050)
まず何のプログラム言語を使われるのか分からないし、またプログラム言語で書いてくれと言われても書けませんのでアルゴリズムの説明をします。 素数問題は、よくある問題です。方法は、 1)Nの平方根を求め、近似整数にし、1を加える。この数をMとする。 2)まず2を使って、Mを全部割り、割り切れる数とそうでない数に分ける(というか、正確には、割り切れる数を棄て、割り切れない数だけを残すのです) 3)次に割り切れない数の最初の数で、割り切れないで残った数の集合の数を全部割り、同じように割り切れない数を残す。 4)後は、同じことの繰り返す。Mまで実行する。 以上の1)から4)までの過程は、まず、1からMまでの数を入れた配列を定義し、iという変数(整数)で、配列内の数を全部割り、割り切れない数だけを配列に残すようなサブルーチンをつくる。i=2でスタートさせ、iの値を乱暴には、2,3,4,5,6……Mとして実行してもいいですが、iで配列を処理した後、次のiの値として、iの次に来る配列内の数を選ぶようにすれば、無駄な計算が省けます。 5)以上で、配列のなかには、M以下の素数が残ります。 6)今度は、1からNまでの数が入った配列を定義し、これを、先の割って、割れない数を残すサブルーチンに通し、今度は、iの値を、Mのなかの最初の数から順番に全部の数を使って、このNまでの数の入った配列を処理する。すると残るのは、素数だけです。 これは古いプログラム言語でのプログラムで、いまは、素数を直接出す関数などがあるかも知れません。しかし、上の計算は、エラトステネスのふるいを実行しているのです。 ヒストグラムはそういう図形を描くのですから、図形を描く方法は別に、10点刻みで、0から100点まで(というのは、11個ボックスができるのですが)のボックスに結果を振り分ける方法でしょう。 100は取りあえず省いて、0から99までとします。 1)試験結果がn個あるなら、nの大きさの配列を造り、そこに、データを入力します。 2)10個の配列を定義し、1から10まで名前を付けます(または10次元配列を定義します)。 3)乱暴な方法では、最初の配列の数を呼び出します。それを10で割り、結果が、0以上1未満か1以上2未満か、という風に、十個の条件分岐を造り、どれかの条件を通ったものは、その条件の番号(1から10まであります)に応じて、順次、10個の配列の対応する番号のものに、あるいは10次元配列のどこかの位置に入れて行きます。 4)この処理がn全体で終われば、十個の配列に幾つ数が入っているか数えるサブルーチンを造り、このサブルーチンで、各配列のなかの数字の数を計算して、これをヒストグラムに置き換えます。 なお、100点はどうするか、というと、十一番目の配列を定義して、10で割って10の時、この配列に入れるか、または、最後の十番目の配列に入れる数の選択条件を、9以上10以下とすれば、十番目の配列に勘定されます。
お礼
本当にありがとうございます、すごく細かく説明していただいて役に立ちました。
お礼
いい参考になりました、ありがとうございました。