teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

7

コードのコメントの変更。

2015/07/25 17:59

投稿

manman
manman

スコア233

answer CHANGED
@@ -4,7 +4,7 @@
4
4
  ```Ruby
5
5
  require 'bigdecimal'
6
6
 
7
- # 1/nが循環小数なら以下OK
7
+ # 1/nが有限小数でないとき
8
8
  def sum(n, i, j)
9
9
  if n > 10
10
10
  a, remain = BigDecimal("1").div(n, j + n).to_s.split('E-') # 念のためn余分に位をとっている

6

コードの修正をおこなう。

2015/07/25 17:59

投稿

manman
manman

スコア233

answer CHANGED
@@ -4,14 +4,14 @@
4
4
  ```Ruby
5
5
  require 'bigdecimal'
6
6
 
7
- # n = 2, 5, 10 以外なら以下でOK
7
+ # 1/nが循環小数なら以下でOK
8
8
  def sum(n, i, j)
9
9
  if n > 10
10
- str, remain = BigDecimal("1").div(n, j + n).to_s.split('E-') # 念のためn余分に位をとっている
10
+ a, remain = BigDecimal("1").div(n, j + n).to_s.split('E-') # 念のためn余分に位をとっている
11
11
  else
12
- str, remain = BigDecimal("1").div(n, j + n).to_s.split('E') # 念のためn余分に位をとっている
12
+ a, remain = BigDecimal("1").div(n, j + n).to_s.split('E') # 念のためn余分に位をとっている
13
13
  end
14
- x, y, *z = str.split('')
14
+ x, y, *z = a.split('')
15
15
  z.map(&:to_i).unshift(0 * remain.to_i)[i - 1..j - 1].inject(:+)
16
16
  end
17
17
 

5

コードを短くしてみた。

2015/07/25 17:18

投稿

manman
manman

スコア233

answer CHANGED
@@ -8,13 +8,11 @@
8
8
  def sum(n, i, j)
9
9
  if n > 10
10
10
  str, remain = BigDecimal("1").div(n, j + n).to_s.split('E-') # 念のためn余分に位をとっている
11
- x, y, *z = str.split('')
12
- return z.map(&:to_i).unshift(0 * remain.to_i)[i - 1..j - 1].inject(:+)
13
11
  else
14
12
  str, remain = BigDecimal("1").div(n, j + n).to_s.split('E') # 念のためn余分に位をとっている
15
- x, y, *z = str.split('')
16
- return z.map(&:to_i)[i - 1..j - 1].inject(:+)
17
13
  end
14
+ x, y, *z = str.split('')
15
+ z.map(&:to_i).unshift(0 * remain.to_i)[i - 1..j - 1].inject(:+)
18
16
  end
19
17
 
20
18
  p sum(7, 3, 8)

4

しょうもないミスをしていたので修正。

2015/07/25 16:48

投稿

manman
manman

スコア233

answer CHANGED
@@ -9,11 +9,11 @@
9
9
  if n > 10
10
10
  str, remain = BigDecimal("1").div(n, j + n).to_s.split('E-') # 念のためn余分に位をとっている
11
11
  x, y, *z = str.split('')
12
- return z.map(&:to_i).unshift(0 * remain.to_i)[i - 1, j - 1].inject(:+)
12
+ return z.map(&:to_i).unshift(0 * remain.to_i)[i - 1..j - 1].inject(:+)
13
13
  else
14
14
  str, remain = BigDecimal("1").div(n, j + n).to_s.split('E') # 念のためn余分に位をとっている
15
15
  x, y, *z = str.split('')
16
- return z.map(&:to_i)[i - 1, j - 1].inject(:+)
16
+ return z.map(&:to_i)[i - 1..j - 1].inject(:+)
17
17
  end
18
18
  end
19
19
 
@@ -21,5 +21,5 @@
21
21
  p sum(97, 2, 96)
22
22
  ```
23
23
  実行結果
24
- 29
24
+ 27
25
25
  432

3

n が 10 未満でもOK

2015/07/25 16:31

投稿

manman
manman

スコア233

answer CHANGED
@@ -4,13 +4,22 @@
4
4
  ```Ruby
5
5
  require 'bigdecimal'
6
6
 
7
+ # n = 2, 5, 10 以外なら以下でOK
7
- def sum(n, i, j)
8
+ def sum(n, i, j)
9
+ if n > 10
8
- str, remain = BigDecimal("1").div(n, j + n).to_s.split('E-') # 念のためn余分に位をとっている
10
+ str, remain = BigDecimal("1").div(n, j + n).to_s.split('E-') # 念のためn余分に位をとっている
9
- x, y, *z = str.split('')
11
+ x, y, *z = str.split('')
10
- z.map(&:to_i).unshift(0 * remain.to_i)[i - 1, j - 1].inject(:+)
12
+ return z.map(&:to_i).unshift(0 * remain.to_i)[i - 1, j - 1].inject(:+)
13
+ else
14
+ str, remain = BigDecimal("1").div(n, j + n).to_s.split('E') # 念のためn余分に位をとっている
15
+ x, y, *z = str.split('')
16
+ return z.map(&:to_i)[i - 1, j - 1].inject(:+)
17
+ end
11
18
  end
12
19
 
20
+ p sum(7, 3, 8)
13
21
  p sum(97, 2, 96)
14
22
  ```
15
23
  実行結果
24
+ 29
16
25
  432

2

コメントを追加した。

2015/07/25 16:10

投稿

manman
manman

スコア233

answer CHANGED
@@ -5,7 +5,7 @@
5
5
  require 'bigdecimal'
6
6
 
7
7
  def sum(n, i, j)
8
- str, remain = BigDecimal("1").div(n, j + n).to_s.split('E-')
8
+ str, remain = BigDecimal("1").div(n, j + n).to_s.split('E-') # 念のためn余分に位をとっている
9
9
  x, y, *z = str.split('')
10
10
  z.map(&:to_i).unshift(0 * remain.to_i)[i - 1, j - 1].inject(:+)
11
11
  end

1

文を追加してみた。

2015/07/25 15:15

投稿

manman
manman

スコア233

answer CHANGED
@@ -1,3 +1,5 @@
1
+ シンプルに解いてみた。
2
+
1
3
  jの上限はメモリが許す限りです。
2
4
  ```Ruby
3
5
  require 'bigdecimal'