初級プログラミング演習1の第1回~第3回の備忘録です!
解説のような解説じゃないような…問題文の意味がまずはわかってくれると幸いです。
目次
第1回
1共通 ルートn
まずは、ルート(平方根)がわからないと駄目ですね。
ルート4(√4)=2
ルート9(√9)=3
…
みたいなやつ
※3を二乗したら9になりますよね。√9 = 3って、数学の授業で出てきたやつです。
平方根は、math.hのsqrt()で出来ますね。
1 |
a = sqrt(n); |
みたいにしましょう。
平方根になっているか?は、以下のようにprintfしてみて確認してみましょう。
1 2 |
printf("n:%ld\n", n); printf("a^2:%ld\n", a*a); |
※100点にならず、80点台の人は教授のこの辺りの裏課題がクリアできていないことになります。共通なので、他の人のプログラムと解説が公開されているかと思いますので、解説を見てみましょうね。
1-1選択 素因数2-3-5(2018年度)
2018年度は、1-1選択でした。2020年度は1-3選択かな?
n=2^p*3^q*5^r*s(sは2でも3でも5でも割り切れない数)
の、2^p * 3^q * 5^r の部分を求める問題
なので、
nを2で割れるまで割る
次に、3で割れるまで割る
次に、5で割れるまで割る
割り切れなかった数字=s
になります。
ここで求めたいのは、2^p*3^q*5^rの部分になるので
式を変換し
n=2^p*3^q*5^r*s
を
n/s = 2^p*3^q*5^r
にすれば良いですね。
なので、n÷s(n/s)を最後に行った答えを出すプログラムになりますね。
割れるまで割る…
というのは、まず割り切れるか?を判断しないといけません。
1 |
if((a%2) == 0) |
であれば、2で割り切れるということになりますね。
a%2…%は、a/2と違い余りを出す計算
余りが0ということは、割り切れるということです。
1-2選択 n以下の最大2べき数(2018年度)
2020年度の1-1選択なのかな…?
2のべき乗は、以下のようになりますね。
2の0乗…1
2の1乗…2
2の2乗…4
2の3乗…8
2の4乗…16
2の5乗…32
n以下、例えばn=17であれば、17以下の16を表示したいです。
1 2 3 4 5 6 |
while(a*2 < 17) { a = a*2; printf("a[%d] < 17\n", a); } |
みたいにすして、一度確認してみたらいかがでしょうか?
1-3選択 n以上の最小の2べき数の指数(2018年度)
2020年度の1-2かな?
こちらは、1-2選択「n以下の最大2べき数」に似た問題です。
2のべき乗は、以下のようになりますね。(おさらい)
2の0乗…1
2の1乗…2
2の2乗…4
2の3乗…8
2の4乗…16
2の5乗…32
今度は、n以上のべき乗の指数になります
n=17であれば、n以上(32)の時の指数2の5乗なので…
5を表示すればよいですね。
以下みたいな感じ?忘れたけど。
1 2 3 4 5 6 7 |
while(1) { a = a*2; i++; printf("[%d]乗 = a[%d]\n", i, a); if(n < a) break; } |
第2回
2共通 最長等値区間
これは、問題文分かりましたかね?
1 1 1 1 2 2 3 3 3 3 3 4 4 4
みたいになっていた時に、
1の長さ4
2の長さ2
3の長さ5
4の長さ3
なので、一番長かった3の長さの「5」を表示するプログラムですね。
scanfで、1文字ずつ読み込んで同じ数の回数を数えればよいですね。
みたいな感じでしたっけ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
while(scanf()!=EOF) { //1つ前の数字と同じだったら… //数える(+1する) //違う数字だったら… //今まで数えた長さが最大化確認して保持する //0から数えなおす //今の数字を1つ前の数字と入れ替える } //ごにょごにょ //結果表示的な? |
2-1選択 最長の上昇区間
今度は、「上昇区間」という表現です。
1 |
11 12 13 14 2 3 1 1 2 3 2 2 2 |
みたなときに、小さい順に並んでいる部分=上昇区間になります。
11 12 13 14
2 3
1
1 2 3
2
2
2
という解釈かな?
11 12 13 14の4つが一番長いので、それを調べます。
2共通と同じ感じですね。
第3回
3共通 最大の三角形
標準入力から、以下のような数字が来た時にどの数字の組み合わせで出来る三角形が一番大きいかを調べるプログラムですね。
1 2 3 4 5 6 7 8 |
標準入力 1 2 3 3 4 5 12 13 5 6 8 10 正解(標準出力) 3 |
※3番目の組み合わせ、12 13 5で出来る三角形の面積が一番大きいみたいです。
※ちなみに、1,2,3では三角形はできません。そういったところも考えないといけないプログラムです。
1 2 3 4 |
★三角形を作るための条件★ http://physics.thick.jp/Mathematics_A/Section5/5-3.html a.2つの辺の長さを足し合わせると残りの1つの辺の長さより長くなる。 b.また、2の辺の長さを引いた時、残りの1つの辺の長さより短くなる。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//3つの数字を取る方法 while (scanf("%d %d %d\n", &a, &b, &c) != EOF) { printf("a=%d b=%d c=%d\n", a,b,c); //三角形ができる条件の数字a,b,cかを判定 //三角形の面積を求める「(底辺×高さ)÷2」 //最大の面積? } //最後に表示 |
みたいにすればいけますかね。
3-1選択 最大・最小
setseq(n);とseq();の使い方がわからないと駄目ですね。
とりあえず、以下のソースコードを実行してみてはいかが?
標準入力から、10ときたら10個+0という数字が生成されます。
※この最後の0意外の数字について、最大最小を行いますね。
コンパイル、採点できない!!!
ここから特殊です。
seq.cとp3-1.cを選んだ状態(左に青い線がある状態)にして、「選択中のファイルをコンパイル」を選びます。
※採点のときも同じです。下にある方のボタンを選びます。
3-2選択 最大・平均・最小
「3-1選択 最大・最小」の+αですね。平均も求めましょう
平均は、全部の数字の合計÷合計した数
なので、足した数÷nとかで良さそうですね。
小数点の桁数は、自分で調べてみましょう。
C言語 printf 小数点
とかです。