Advertisement
dredder_gun

mult-in-column

Mar 21st, 2017
382
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (defn parse-int [s]
  2.    (Integer. (re-find  #"\d+" s )))
  3.  
  4. (defn mult [x y]
  5.   "Умножение в столбик двух чисел в виде строки. На выход: число в виде строки.
  6.  Отрицательные числа пока не перемножаются"
  7.   (let [x (map #(parse-int (str %)) x)
  8.         y (map #(parse-int (str %)) (reverse y))
  9.         leftover (atom 0)
  10.         result (atom 0)
  11.         summarize-it (atom [])
  12.         multiple (fn [unit-of-y a] (+ (* unit-of-y (last a)) @leftover))]
  13.     (loop [a x zero-digit []]
  14.       (when-not (empty? a)
  15.         (reset! leftover 0)
  16.         (swap! summarize-it
  17.           (fn [n] (conj n
  18.             (reduce
  19.               (fn [coll-sum unit-of-y]
  20.                 (reset! result (rem (multiple unit-of-y a) 10))
  21.                 (reset! leftover (quot (multiple unit-of-y a) 10))
  22.                 (if (= unit-of-y (last y))
  23.                   (into (vec (reverse (into (into coll-sum [@result]) [@leftover]))) zero-digit)
  24.                   (into coll-sum [@result])))
  25.             [] y))))
  26.             (recur (drop-last a) (conj zero-digit 0))))
  27.             (str (reduce ; суммируем перемноженные числа
  28.               (fn [n m] (+ n (parse-int (apply str m))))
  29.               0
  30.               @summarize-it))))
  31.  
  32. (mult "547" "83")
  33. (mult "78547" "583")
  34. (mult "1" "0")
  35. (mult "1" "1")
  36. (mult "1" "01")
  37. (mult "0" "01")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement