黄昏より暗きもの、血の流れより赤きもの

読者です 読者をやめる 読者になる 読者になる

黄昏より暗きもの、血の流れより赤きもの

自分の好きな事を好きなように書いて行きます。

2010年度の灘中学校で出題された、ガウス記号の問題をC言語で解いてみる(前編)

問題


下の問題は2010年度の灘中学校の入試問題*1 を編集したものである。





プログラムは得意。でも数学が苦手なP君はこの問題を以下の[問題1]〜[問題3]のようなソースコードを組んで問題(2)(3)を解決しようとした。以下の問題1〜問題3を答えよ。



実数xについて、xを超えない最大の整数を[x]とする。

問題1:double xを引数として、[x]を返り値とする関数int gauss(double x)のソースコードを記述せよ。

[ヒント]:floor(double x)関数を使うとxの整数部分を求める事が出来る。

以下の問題では、問題1で作成した関数を断り無しに使って良いものとする。

問題2:数列b_nをb_n=[10(n+1)/7]と定義する。Σ(1<=n<=200)b_nの値を求めるソースコードを記述し実行結果を表示することで、(2)を解決せよ。

問題3:自然数m,nがある。今数列a_nを、a_n=[n^2/m]と定義する。このときa_1〜a_nまでに登場する自然数の種類kを出力する関数int series(int m,int n)のソースコードを記述せよ。又series(20,20)を実行し表示する事で(3)を解決せよ。

*今回は問題1,問題2を中心に解説して行きます。

問題1の方針


例えば[4.2]=4,[-4.2]=-5となる、xの整数部分に注目すればx>=0のときにxの整数部分、x<0の時は(xの整数部分)-1の値が出力されている。さてxの整数部分をyすると、x>0のとき、[x]=y、x<0のとき、[x]=y-1 とyを使って表せる。以上よりyをfloor(x)で置き換えてやればよい。

問題1の解答


問題2の方針


Σは平たく言えば合計の意味で、ループで合計を作ってやれば良い。このとき1=

問題2の解答


問題2のソースコード


問題2の実行結果


上記のソースコードが実行してみる。いきなり答えを言うが28914が表示されていればよい。下記の実行結果をみてみると、28914が表示されており(2)が解決された。




後書き


今回(2)をプログラムを使って順々に合計を求めて行く方法を取った。人力で何れ解くことは出来るものの、入試には時間制限があるので問題における規則性などを見いだし効率よく計算する事が要求される。実際省略された(1)には問題の規則性を掴むヒントが掲載されていた。又高校生以降の方で(2)に至るまでの過程を厳密にやりたい方は、以下の(1)〜(4)の手順を踏む事をお勧めしたい。尚、(1)(2)の証明は「ガウスの記号(私の備忘録)」を参考にした。



実数xについて、xを超えない最大の整数を[x]とする。

(1):実数x,yについて、[x]+[y]<=[x+y]を示せ。

(2):実数xと整数nについて、[x+n]=[x]+nを示せ。

(3):1<=n<=100を満たす全ての自然数nについて、[10(n+1)/7] + [10(202-n)/7]の値として考えられるものを全て答えよ。

(4):Σ(1<=n<=200)[10(n+1)/7]の値を求めよ。