このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集のその他セットから「総和の計算 (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
2つの整数 A , B が与えられるので、 A, A + 1, …. B - 1, B の総和を求めてください。
入力される値
1 |
A B |
- 2 つの整数 A , B が 1 行で入力されます。
期待する出力
A, A + 1, …. B - 1, B の総和を 1 行で出力してください。条件
すべてのテストケースにおいて、以下の条件をみたします。
- 0 ≦ A ≦ B < 10 ^ 11
考え方
基本的には、総和を計算する以下の公式を応用すれば良い。
1 |
sum = n * (n + 1) / 2 |
この公式は、 1 から任意の整数 n までの総和を出す公式である。
ただし、与えられている問題は、 A から B までの総和を出す公式であるため、上記の公式はそのまま適用できない。したがって、
- 1 から B までの総和を求め
- その総和から 1 から A までの総和を引く
という作業を行えば良い。
注意しなければいけないのは、
Int 型で計算すると桁あふれを起こす可能性がある、ということである。
したがって、ここでは有効桁数が 38桁あり、また10進数を2進数の内部表現ではなく、10進数として扱うことで計算誤差を排除した
Decimal 型を使って計算を行なっている。
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import Foundation let ia = readLine()!.split(separator: " ").map { Double($0)! } var a = Decimal(ia[0]) var b = Decimal(ia[1]) var cc = Decimal() if a == b { cc = a + b } else { let n = b - a + 1 cc = 0.5 * n * (b + a) } print(cc) |