このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集の文字列処理メニューから「巨大な数の足し算 (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
数値を表す文字列 S , T が与えられるので、S + T の結果を表す文字列を出力してください。繰り上がりが発生する可能性があるので注意してください。
入力される値
1 2 |
S T |
- 1 行目に文字列 S , 2 行目に文字列 T が与えられます。
期待する出力
S + T の結果を表す文字列を出力してください。条件
- S の各文字は、アルファベットの大文字または小文字
- 1 ≦ | S| , | T| ≦ 1000 ( | S| , | T| は、 それぞれ S , T の文字数です。)
- | S| = | T|
考え方
執筆中。
筆算と同じく、位の小さい桁から計算し、繰り上がりが発生したら次の桁に持ち越す。
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
// 一連の入力を読み込む let sa = Array(AnyIterator { readLine() }).map{ String($0) } // 問題の条件に対応させる(ついでに、数値1桁に分解) // 繰り上がりを考える必要があるので、あらかじめ反転させておく //let s = "1234567890" //let t = "9876543210" let s = sa[0].reversed().map { Int(String($0))! } let t = sa[1].reversed().map { Int(String($0))! } // 合計 var sum = "" // 繰り上がり var carry = false // 各桁を足しながら、文字列に追加する for i in 0..<s.count { // 各桁と繰り上がりの和を求める var st = s[i] + t[i] + (carry ? 1 : 0) // 繰り上がりが発生する場合 if st > 9 { carry = true st -= 10 } else { carry = false } // 合計用の配列に和を追加 sum.append(String(st)) } // もし、最終桁で繰り上がりが発生していた場合 if carry { sum.append("1") } // 結果の出力 // sum は末尾から表記されているので、逆順で表示させる print(String(sum.reversed())) |