初級プログラミング演習1の第4回~第5回の備忘録です!
目次
第4回
4共通 素因数の個数
まず、素数がわからないと駄目ですね…
2,3,5,7,11…
と、その数以外で割れない数のことですね。
4は、2で割れる
9は、3で割れる
ので、素数では有りません。
1も素数の定義に入りません。
1が素数だと、他の数がすべて1で割れてしまうので…
※問題文にもありますね。
1 2 3 4 5 6 7 8 |
標準入力 18 標準出力 2 注 11 = 111?であるから11の素因数は11だけの1種類である。??18 = 2^1*3^2 であるから、18の素因数は、2と3の2種類である。? 素数は、2, 3, 5, 7, 11, ... とし、1 は素数とはしない。 |
ただし、本課題には裏課題が仕組まれており、効率の良い計算を行うことが求められています。
効率的なアルゴリズム
https://algo-logic.info/is-prime/
を参考にどぞ!
標準入力からの数字で、素数を求める時に自分自身が素数の場合計算量が多くなってしまい、実行時間エラーになります。
数学的に、他の素数が含まれている場合、√n以内に素数があることがわかっておりますので、こういった部分を使い計算量を短縮する必要があります。
まぁ、共通問題なので他の人のを参考にすればよろしいかと。
4-1選択 fizzbuzz
おなじみFizzBuzz問題です。
FizzBuss C言語
いくつかの数字が取得できるので、
- fizz:3で割り切れる
- buzz:5で割り切れる
- fizzbuzz:3でも5でも割り切れる
の数を数えるプログラムですね。
ここで注意点は、3でも5でも割り切れる数はについては、fizzにもbuzzにもカウントしないということが、今回のプログラムになります。
※試してませんが、15で割れる、3で割れる、5で割れる…ということでもよいのかもしれません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
//標準入力から取得 scanf("%d\n", &n); //取得した数値からデータを生成する setseq(n); while(1) { //数値列を取得 data = seq(); //確認用 printf("data[%d]\n", data); //0であれば数列が終わりなのでbreakで抜ける if(0 == data) break; //3でも5でも割れる? //5で割れる? //3で割れる? } |
みたいな感じかな?
4-2選択 最長の奇数区間
2の選択の区間の問題の奇数番ですね。
1 |
-11 7 9 2 1 3 3 6 6 7 7 7 7 7 |
のような場合、
-11 7 9
2
1 3 3
6
6
7 7 7 7 7
になるので、最後の「7 7 7 7 7」と奇数が5個並んでいるので5と表示したいプログラムですね。
奇数?
2で割って、余りが0だったら偶数。それ以外は、奇数ですね。
1 2 3 4 5 6 7 8 |
if(a%2 == 0) { //偶数 } else { //奇数 } |
それ以外は奇数。そんな感じです。
第5回
5共通 数値表現の値の総計
あー説明が難しいですね…
1 2 3 4 5 6 |
標準入力 Calculate: +12-34+0.25 標準出力 3 |
考え方
12 + (-34) + 0 + 25
=3
1 2 3 4 5 |
標準入力 Videos will be made opened on 2019-04-10, 12:00:00. 標準出力 2017 |
2019 + (-4) + (-10) + 12 + 0 + 0
=2017
みたいな感じです。
先頭から文字をとっていくのが良いのか、一番最後から文字をとっていくのが良いのか…
5-2選択 英字並び・数字並びの出現回数
これは、初級プログラミング1で出てきた教授のプログラムについて、コメントをつけるだけですね。
※英字部分だけを数える。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
He is a good guy, reported by'er on 8th of March,2018. He is a good guy reported by er on th of march |
の12この英字並びを数えるプログラムですね。
まぁ、プログラムの元ネタは初級プログラミングで出てるので問題ないでしょう。英字(isalpha)以外の文字から、英字を読み込んだタイミングで+1してるだけですね。
5-2選択 英字並び・数字並びの出現回数
こちらも、初級プログラミング1で出てきた教授のプログラムについて、コメントをつけるだけですね。
※英字部分に追加して、さらに数字部分を数える。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
He is a good guy reported by er on 8(数字として数える) th of march 2018(数字として数える) |
の12個の英字並び、2個の数字並びを数えるプログラムですね。
まぁ、プログラムの元ネタは初級プログラミングで出てるので問題ないでしょう。