Hamamatsu.rb #54 問題4 回答

作成日:2015/07/17
最終更新日:2020/07/09

Hamamatsu.rb #54 問題4 回答

作成日:2015/07/17
最終更新日:2020/07/09

概要

問題4

問題

1,2,3,4 のいずれかの数字を使って4ケタの整数を作ります。 同じ数字を何度使ってもかまいません。次の問に答えなさい。

  1. 整数は全部で何個できますか。
  2. できたすべての整数の一の位の数の和を求めなさい。
  3. できたすべての整数の和を求めなさい。

小問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
$