• ベストアンサー

プログラムについて

次の問題が自分はどうでもできないので、皆さんに助けをお願いしたいのです。 問題は:     N以下の素数を求めるプログラムと     試験の得点(0以上100以下の整数)を入力し,得点データの分布を10点刻    みのヒストグラムの形式で出力するプログラムが分かりません、ぜひ教え    ていただきたいです。よろしくお願いします!

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

  • ベストアンサー
  • NyaoT1980
  • ベストアンサー率28% (61/214)
回答No.3

素数のC言語のプログラムは参考URLのところに載っています。

参考URL:
http://www.stat.phys.kyushu-u.ac.jp/~ryokawa/cbegin2_3/html4/cbegin_c1_s9.html
kosimosi
質問者

お礼

いい参考になりました、ありがとうございました。

その他の回答 (3)

回答No.4

このいかにもな問題と「困り度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とか言うなら別ですが。) あと、この質問カテゴリが違うと思います。 理系の学問ではなく、 「コンピュータ&インターネット」の「プログラミング」の中が正解でしょう。 以上。不明な点があれば補足をどうぞ。

kosimosi
質問者

お礼

本当にいい勉強になりました、ありがとうございます。

  • uni050
  • ベストアンサー率26% (16/60)
回答No.2

学校の授業か何かなら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 こんな所ですかね。参考程度にしてください。

kosimosi
質問者

お礼

ありがとうございます、勉強になりました!

  • starflora
  • ベストアンサー率61% (647/1050)
回答No.1

    まず何のプログラム言語を使われるのか分からないし、またプログラム言語で書いてくれと言われても書けませんのでアルゴリズムの説明をします。     素数問題は、よくある問題です。方法は、   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以下とすれば、十番目の配列に勘定されます。  

kosimosi
質問者

お礼

本当にありがとうございます、すごく細かく説明していただいて役に立ちました。

関連するQ&A

  • プログラムについて

    次の問題が自分はどうしても分からないので、みなさんの力をお借りしたいのです。 問題は:   N以下の素数を求めるプログラムと   試験の得点(0以上100以下の整数)を入力し,得点データの分布を10点刻    みのヒストグラムの形式で出力するプログラムの作成が分かりませんので、   何とかよろしくお願いします!

  • 下記に記すプログラムを解いてください。

    Σ1/(i + k) の計算 [問題]正の整数 n を入力し,次の式の値を計算し,出力するプログラムを書け. 1/1 + 1/2 + 1/3 + ・・・ + 1/n 上記の問題が解けませんので解答お願いします。 上記の問題をdouble形式でお願いします。 上記の問題をintmain()形式でお願いします。

  • プログラムを教えてください!

    レポートの質問です。 以下の問題のプログラムを作らなければいけないのですが、いろいろと調べてみてもまったくわかりません。 わかる方プログラム教えてください! 課題1 合同式法を用いて,区間[0,1] (区間[0,1)でも良い) の 一様乱数を100 万個生成し,以下を報告せよ.ただし,一様乱数の生成にはC 言語で自作したプログラムを用いること. (1a) 平均の数値計算結果 (1b) 標準偏差の数値計算結果 (1c) 一様乱数のヒストグラム.ヒストグラムは区間[0,1] を100 分割して 作成すること. 課題2 中心極限定理に基づく「間便法」を用いて,区間[0,1] (区 間[0,1)でも良い) の一様乱数から標準正規分布N(0,1)に従う正規乱数を100 万 個生成し,以下を報告せよ.ただし,正規乱数の生成にはC言語で自作したプ ログラムを用いること. (2a) 平均の数値計算結果 (2b) 標準偏差の数値計算結果 (2c) 正規乱数のヒストグラム.ヒストグラムは区間[-5, 5] を100 分割して 作成すること.

  • Microsoft Visual Studio 2008で質問があるの

    Microsoft Visual Studio 2008で質問があるのですが… 課題で、テキストファイルに各生徒(架空の人物)の学籍番号、各教科の点数書いたファイルを作成し、そのファイルを読み取り、教科ごとと各生徒ごとの平均点、生徒ごとの平均点の高い順から降順に並べたものを画面に出力する(windows¥system~とかいうやつです)プログラムを作ったのですが、そこからさらにまた各生徒の得点分布(ヒストグラム)・偏差値を出力するプログラムの作り方がわかりません。生徒数は10人、教科は5教科としています。 私はあまりこのソフトのことをわかってないので、伝わりにくい文章だったと思いますが、どうか得点分布・偏差値を求めるプログラムの作り方を教えていただけませんでしょうか…?

  • 0 からa-1 までの整数の乱数をn 個発生させ、発生した整数のヒスト

    0 からa-1 までの整数の乱数をn 個発生させ、発生した整数のヒストグラムをプリントアウトしたいです.また,a とnはコマンドラインから引き渡します 0 からa-1 までの整数を発生する乱数の書き方は (int)((double)rand()/((double)RAND_MAX+1) *a); プログラムをRandHist としたとき RnadHist 10 1000 と入力すれば 0 982 1 1035 2 956 3 1102 ・ ・ 9 971 などと。出力されるようなプログラムを作る問題ですが,a とn は、任意に変えられるように したいです. どなたか教えてください.

  • 反転のプログラムについて

    プログラムの質問で「入力された正の整数において、桁の順序を反転したプログラムを作れ。321→123、32100→123など。0の時は0と表示させろ」という問題がどうしてもわかりません。講師の人が10で割ればいいと言ってるんですがいまいちわかっていません。使ってるのはVisual Stadio 2005のC++です。教えてもらえませんか?ついでに 「M以上N以下の正の整数で、素数であるものを小さい方から表示するプログラムを作れ」も教えてもらえれば幸いです。アドバイスでも結構ですのでよろしくお願いします

  • プログラム 教えてください

    1.INPUT文で入力された整数kに対し,3以上7以下の整数をランダムに(等確率で)k個生成し,同じ行に表示させるプログラム 2.INPUT文で入力された整数m, n, kに対し,m以上n以下の整数をランダムに(等確率で)k個生成し,同じ行に表示させるプログラム を教えてください。

  • プログラムの勉強でわからないところがあります

    明解C言語の入門編、演習4-3 二つの整数値を読み込んで、小さい方の数以上で大きい方の数以下の整数を全て加えた値を表示するプログラムを作成するものなのですが、うまくいかなく困っています。 他の書き方でやれば普通にいけると思うのですが、どうしてこれだとできないのかがわからないとすっきりしなくって・・・ 以下のようなプログラムで試しています。 #include <stdio.h> int main(void) { int n1,n2,n3,n4; puts("二つの整数を入力してください"); printf("整数1:"); scanf("%d",&n1); printf("整数2:"); scanf("%d",&n2); n3=(n1>n2) ? n2 : n1; n4=(n1>n2) ? n1 : n2; printf("%d以上%d以下の全整数の和は", n3,n4); int num=n1; int sub=n2; int wa; printf("num=%d sub=%dで",num,sub); do{ if (n1>n2) { wa=num+sub; /* 大きいほうの数(num)にsub(小さい方の数+0,2,3,4・・・)を足していく */ sub=sub+1;/* ここを通るたびにsubに+1 */ printf("%d",wa);} else { wa=sub+num; num=num+1; printf("%d",wa);} }while(sub!=n1 || num !=n2); /* 小さい方の数に1足していったものが大きい方の数と等しくなったら0を生成し終了 */ printf ("です\n"); return 0; } このプログラムで試すと、延々と計算をし続けていってしまうのです。 whileあたりがおかしいのかと思ったのですが、どこがおかしいのかわからなくって・・ whileは、中の数字が0を生成する場合止まる、というものだったと思うので、小さい方の数字に1ずつ足していって、大きい方の数字と等しくならない限り続けるように作ったつもりなのですが・・・ どこがおかしいのか教えて頂けると嬉しいです。 それとワガママなお願いなのですが、できれば、正答のようなものは書かないでもらえると助かります、どこが間違いなのかだけ教えて頂いて、後はなんとか自分の力でこなしてみたいので・・・ 自分勝手なお願いですが、よろしくお願いします。

  • アセンブラのプログラム

    大小2つの整数を読み取り、この2つの整数間のすべての整数を 出力するプログラムを書け という問題が分かりません分かる方どうか助力お願いいたします

  • プログラム (BASIC) 教えてください

    コンピュータが 3桁の整数(100~999) n をランダムに生成。 「3桁の整数(100~999) n を当ててください」と表示。 解答者はキーボードで整数 x を入力。 x > n なら「もっと小さい数です.再入力してください」と表示してゲームを継続( 3. に戻り,x を再入力)、 x < n なら「もっと大きい数です.再入力してください」と表示してゲームを継続( 3. に戻り,x を再入力)、 x = n となったら ループを抜ける。 「正解です」と表示して,ゲーム終了。 100 RANDOMIZE 110 PRINT "3桁の整数(100~999) n を当ててください" 120 LET n=100+INT (900*RND) 130 DO 140 INPUT x 150 IF x=n THEN EXIT DO 160 IF x>n THEN 170 PRINT "もっと小さい数です.再入力してください" 180 ELSEIF x<n THEN 190 PRINT "もっと大きい数です.再入力してください" 200 END IF 210 LOOP 220 PRINT "正解です" 230 END このプログラムをIF、END IFを一回のみ使うプログラムに変える方法を教えてください。