このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集の文字列処理メニューから「巨大な数のかけ算 (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
入力される値
1 2 |
S T |
- 1 行目に文字列 S , 2 行目に数値 T が与えられます。
期待する出力
S × T の結果を表す文字列を出力してください。条件
- S の各文字は、アルファベットの大文字または小文字
- 1 ≦ | S| ≦ 1000 ( | S| は、 S の文字数です。)
- | T| = 1 ( | T| は、 T の文字数です。)
- S , T の各文字は 0 ~ 9 のいずれかの数字です。
- S は数値として正しい表記です。
考え方
執筆中。
巨大な数の足し算と基本的な考え方は同じ。
かける数は1桁なので、巨大な数の足し算のプログラムを少し改変するだけで良い。
かける数がゼロの場合にはゼロになるので、 T に相当する値が 0 の場合には早期終了させる。
解答例
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 42 43 44 45 46 47 48 49 50 51 |
// 一連の入力を読み込む let sa = Array(AnyIterator { readLine() }).map{ String($0) } // 問題の条件に対応させる(ついでに、数値1桁に分解) // 繰り上がりを考える必要があるので、あらかじめ反転させておく //let s = "123456789987654321123456789987654321123456789987654321123456789987654321".reversed().map { Int(String($0))! } //let t = 5 // 617283949938271605617283949938271605617283949938271605617283949938271605 // let s = "10000".reversed().map { Int(String($0))! } // let t = 0 let s = sa[0].reversed().map { Int(String($0))! } let t = Int(sa[1])! if t == 0 { // かける数がゼロなら、結果はゼロ print("0") } else { // 合計 var sum = "" // 繰り上がり var carry = 0 // 各桁を足しながら、文字列に追加する for i in 0..<s.count { // 各桁と繰り上がりの和を求める var st = s[i] * t + carry // 繰り上がりが発生する場合 if st > 9 { carry = st / 10 st -= carry * 10 } else { carry = 0 } // 合計用の配列に和を追加 sum.append(String(st)) } // もし、最終桁で繰り上がりが発生していた場合 if carry > 0 { sum.append(String(carry)) } // 結果の出力 // sum は末尾から表記されているので、逆順で表示させる print(String(sum.reversed())) } |