基本情報技術者試験サンプル問題Bを解いてみた!
この記事を書く理由!!!
この記事を書く理由はとっても単純で自分の勉強のためです!!!
自分で解いた問題の解答の仕方と考え方をアウトプットしていくことで自分の力にしたいです。ついでに皆様の役に立つと幸いです!!!!
サンプル問題について
上記のサイトからダウンロードできるので是非してみてください!!!!
アルゴリズムに関する問題
第1問
単純な変数の問題でxにyの値,yにzの値,次にyの値となったxがzに代入されるので答えはカです。ちなみにpythonで書くと下のようになります。
x,y,z=1,2,3
x = y
y = z
z = x #出力
print(str(y)+","+str(z))
第2問
この問題の解き方は集合の考え方を意識する事です!!!!!
3と5で割り切れる数は当たり前ですが条件式に当てはめると3で割り切れると判定する条件にも5で割りきれると判定する条件にも引っかかるので一番最初に処理しなければなりませんなので答えはウであるとわかります!!
第3問
この問題はトレースをする事で簡単に解く事が
できます!
このプログラムを理解するにあたって下記の事を理解して下さい❗️
引数inには配列{3,2,1,6,5,4}が入力として与えられている。
空配列out[i]にはout[i-1]+in[i]がfor文による繰り返し処理により追加される。
“注意”iはfor文による繰り返しの回数を示す
これらの事を理解してトレースして行きます。
out[1]をまず求めていきます。
変数tailにはまだoutには要素がないので何にも代入されないのでout[1]=tail+in[1]=3であると求められるます。そして同様の計算をout[5]まで続けると17であると求める事ができます!
第4問
この問題を解く上で重要な事は問題文を読む事です❗️
では実際に解いて行きましょう♪
まず選択肢aから確定させていきます。
選択肢aは簡単にいうとif文かwhile文かを選択する問題です。実際に数値を入れると1回の処理では殆どのケースで最大公約数がもとまらない事がわかるのでこれはwhile文であるウかエであると絞り込む事ができます。さらに選択肢bは問題文を読むとnum1 が num2 より大きいとき,num1 と num2 の最大公約数は,
(num1 - num2) と num2 の最大公約数と等しい。という記載があります。この事からbの条件分岐が真の場合に行われる処理がnum1であるxにx-y(num1-num2)を代入していることからbは
x>yという事がわかりエであるとわかります!
第9問
再帰関数と2次元配列に関する問題です!!!!!
最初の文章が書いてありますが正直無視していいです。
試しにorder(1)としてトレースをする事で答えを求めることができます!
トレースの流れ
まずorder(1)として実行するのでifの条件式によりn=1としてtree[n]の要素数を判定し要素数が2であるのでif文内のorder(2(tree[1][1]より))が呼び出される。
再帰関数order(2)を実行するとn=2としてtree[n]の要素数を判定し要素数が2であるのでまたorder(4(tree[2][1]より))が呼び出される。
またまたorder(4)をトレースしていくとさっきと同様に要素数を判定し
要素数が2であるのでorder(8(tree[4][1]))が呼び出される。
order(8)をトレースしていくとtree[8]は要素数が0であるので
n=8がそのまま出力される!!!
この時点で答えがウorエに絞られる!!
ここでorder(8)の処理が終わったので一つ前の処理であるorder(4)がまだ途中なのでorder(4)の処理を終わらせます。
order(4)をさっきの続きから処理を行うとn=4が出力されます。
このことから8,4の順番で出力されることが確定するので答えが
ウであると求める事ができます。
第16問
この問題をまず見て思う事は”捨て問かな?”だと思います!!!
正直言ってその通りで僕もまずセキュリティから解いた関係上この問題が最終問題となり,時間が足りずうまく解くことができませんでした。
時間も足りないしこの量の文章を素早くよんで正しく理解する事はとても難しいと感じました。
次に解き方について解説していきます!!!
まずはこのプログラムを実行する目的について理解する前にこの
文章を理解する必要があります。
この文章と疑似言語から以下の事について理解する必要があります。
与えられた値(16進数)を2進数に変換しても14ビットよりも大きくならない(条件より)
ビットパターン1110xxxx 10xxxxxx 10xxxxxxを疑似言語では
{224,128,128}で表している!!!!(x=0の初期値として)6ビットずつ切り出してxxxxxxに値を格納している!!
これらの情報を元に問題を解いてゆくと
このプログラムを実行する目的はUTF-8の符号を求める事であるがこれを言い換えるとencodeの引数から6ビットずつとりだすことが目的であるという事ができます。
6ビットずつ取り出すには1234(10進数)÷1000(10進数)=1余り234というように10進数では10の3乗で割る事で下位3桁を取り出す事ができます。同じように6ビット取り出すには2進数であるので
2の6乗ということは64で割る必要があると考える事ができるのでこの設問の答えは64であると結論づけられます。
この記事が気に入ったらサポートをしてみませんか?