Hamamatsu.rb #54 問題4 回答
作成日 | : | 2015/07/17 |
---|---|---|
最終更新日 | : | 2020/07/09 |
Hamamatsu.rb #54 問題4 回答
作成日 | : | 2015/07/17 |
---|---|---|
最終更新日 | : | 2020/07/09 |
概要
- Hamamatsu.rb #54のCodeKataKataの問題4を解きました。
問題4
問題
1,2,3,4 のいずれかの数字を使って4ケタの整数を作ります。 同じ数字を何度使ってもかまいません。次の問に答えなさい。
- 整数は全部で何個できますか。
- できたすべての整数の一の位の数の和を求めなさい。
- できたすべての整数の和を求めなさい。
小問1
各桁について考える。\(n\)種類の数字で各桁は構成されるとき、1桁当たりの組合せ\(x_j\)は次式で与えられる。
\[
\begin{align*}
x_j &= {}_n C_1 \\
&= n \\
\end{align*}
\tag{1}
\]
式1.
それぞれの桁で同じ数字を何度使うことができるので、\(m\)桁の整数の組み合わせは次式となる。
\[
\begin{align*}
x_{j}^{m} = n^m
\end{align*}
\tag{2}
\]
式2.
小問2
式2.より、\(m\)桁の整数の組み合わせは\(x_{j}^{m}\)通りある。
式1.より、一の位の取り得る数の組み合わせは\(x{j}\)通りであるので、 1種類あたりの数の総数\(x{s}\)は次式で与えられる。
\[
\begin{align*}
x_{s} &= \frac{x_{j}^{m}}{x_{j}} \\
&= x_{j}^{m-1} \\
\end{align*}
\tag{3}
\]
式3.
一の位の取り得る数を\(y_1 ... y_n\)とすると、一の位の総和\(S_1\)は次式で与えられる。
\[
\begin{align*}
S_1 &= \sum_{k=1}^{n}y_k x_{s} \\
&= x_{j}^{m-1} \sum_{k=1}^{n}y_k \\
\end{align*}
\tag{4}
\]
式4.
小問3
大問より各桁の取り得る数は\(y_1 ... y_n\)であるので、式(4)をl桁目の総和\(S_l\)は次式で与えられる。
\[
\begin{align*}
S_l &= 10^{l-1} x_{j}^{m-1} \sum_{k=1}^{n}y_k \\\\
\end{align*}
\tag{5}
\]
式5.
また、あるm桁の整数\(N\)は次式で表される。
\[
\begin{align*}
N &= \sum_{l=1}^{m} 10^{l-1}y_{k_l}
\end{align*}
\tag{6}
\]
式6.
ここで\(y_{kl}\)は任意の\(n\)種類の数字から与えられる。 \(l=1\)において、\(y{k_1}\)の総和を取ると式4.より次式が得られる。
\[
\begin{align*}
S_1 &= \sum_{k_1=1}^{x_j} y_{k_1} \\
&= \sum_{k=1}^{n}y_k x_{s} \\
&= x_{j}^{m-1} \sum_{k=1}^{n}y_k \\
\end{align*}
\tag{7}
\]
式7.
式7.より、すべての整数の総和は次式となる。
\[
\begin{align*}
S_a &= \sum_{l=1}^{m} S_l \\
&= \sum_{l=1}^{m} 10^{l-1} x_{j}^{m-1} \sum_{k=1}^{n}y_k \\
&= x_{j}^{m-1} \sum_{l=1}^{m} 10^{l-1} \sum_{k=1}^{n}y_k \\
&= S_1 \sum_{l=1}^{m} 10^{l-1} \\
\end{align*}
\tag{8}
\]
式8.
プログラム
式2.、式4.、式8.を用いて問題を解くプログラムを作成する。 初期化はn個の1桁の値の配列と桁数を与える。
各小問の答えはpattern、sum_ones_digit、sum_all_patternメソッドで得られる。
ソース1. math4_langur.rb
class Math4 def initialize(pattern, digit) @pattern = pattern @digit = digit end def pattern return @pattern.length ** @digit end def sum_ones_digit return @pattern.reduce{|sum, n| sum + n} * @pattern.length ** (@digit - 1) end def sum_all_pattern return @pattern.reduce{|sum, n| sum + (10 ** (n - 1))} * self.sum_ones_digit end end ary = Array.new([1, 2, 3, 4]) obj = Math4.new(ary, 4) p obj.pattern p obj.sum_ones_digit p obj.sum_all_pattern
上記ソースコードをmath4_langur.rbとして保存し、実行してみた。
コマンド1. コマンド実行結果
$ ruby ./math4_langur.rb 256 640 711040 $