challenge 法演算

ここでいう法演算とは,与えられた数(ここでは「法」と言います)で剰余をとりながら行う計算のことです.たとえば,法が10である場合,以下のように計算します.

  • 足し算
    • 1 + 2 = 3
    • 7 + 3 = 0 (10を10で割った余りは0)
    • 11 + 12 = 1 + 2 = 3
  • 引き算
    • 3 - 2 = 1
    • 2 - 3 = 9
  • 掛け算
    • 2 * 3 = 6
    • 11 * 12 = 1 * 2 = 2
    • 18 * 39 = 8 * 9 = 2

式と法を与えたときに,このような法演算を行い,計算結果を表示するプログラムを作成してください.

注意点

  • プログラムの入力には,式と法が与えられます.
    • 式に現れる数は,整数のみと仮定してかまいません.しかし,法より大きな数が与えられるかもしれませんし,負の数が与えられるかもしれません.
    • 法は2以上の正整数のみが与えられます.
    • 式と法は,プログラムにとって都合のよい形式で与えられると仮定してかまいません.ソースコード中に埋め込んでしまってもかまいません.
  • 足し算,引き算,掛け算に対応してください.
    • 法10の世界においては,1 - 2 と 1 + 8 は同じ意味です.引き算の計算においては,この性質を使い,足し算に変換してから計算してもかまいません.
  • プログラムの出力として,計算結果を表示して下さい.

  • 与えられた式の中に,範囲外の数(負の数や,法の数以上の数)が現れた時には,必ず一度,式全体を正規化し,その結果を表示してから計算を行って下さい.
    • ここでいう「正規化」とは,式の中のすべての項をいったん法で剰余をとり,0以上,法-1以下の範囲になるようにする,ということです
    • 正規化をする際に,引き算を足し算へ変換する処理を一緒に行ってもかまいません.
    • 計算過程で範囲外の数が現れたときには,正規化を行うことが望ましいですが,必ずしも行う必要はありません.(最終的な計算結果が正しければよしとします)

Posted feedbacks - Java

整数環での四則演算と言うことで、素直に実装してみました。 題意にはないですが除算(乗算の逆演算)も加えてみました。答えがない場合には 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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
public class Sample115 {
    public enum Operator {
        Plus {
            @Override public String toString() { return "+"; }
            @Override public int calc(int lhs, int rhs) { return lhs + rhs; }
        },
        Minus {
            @Override public String toString() { return "-"; }
            @Override public int calc(int lhs, int rhs) { return lhs - rhs; }
        },
        Times {
            @Override public String toString() { return "*"; }
            @Override public int calc(int lhs, int rhs) { return lhs * rhs; }
        },
        Divide {
            @Override public String toString() { return "/"; }
            @Override public int calc(int lhs, int rhs) { return lhs / rhs; }
            @Override public int operate(int lhs, int rhs, int mod) {
                System.out.format("%d %s %d = ", lhs, toString(), rhs);
                int l = modulo(lhs, mod);
                int r = modulo(rhs, mod);
                if (lhs != l || rhs != r) {
                    System.out.format("%d %s %d = ", l, toString(), r);
                }
                int ret = 0;
                for (int index = 0; index < mod; index++) {
                    if (l == modulo(r * index, mod)) {
                        ret = index;
                        break;
                    }
                }
                System.out.println(ret);
                return ret;
            }
        };

        public abstract int calc(int lhs, int rhs);
        public int operate(int lhs, int rhs, int mod) {
            System.out.format("%d %s %d = ", lhs, toString(), rhs);
            int l = modulo(lhs, mod);
            int r = modulo(rhs, mod);
            if (lhs != l || rhs != r) {
                System.out.format("%d %s %d = ", l, toString(), r);
            }
            int ret = modulo(calc(l, r), mod);
            System.out.println(ret);
            return ret;
        }
        protected int modulo(int val, int mod) {
            int ret = val;
            while (ret < 0) { ret += mod; }
            while (ret >= mod) { ret -= mod; }
            return ret;
        }
    }

    public static int calcModulo(Operator op, int lhs, int rhs, int mod) {
        return op.operate(lhs, rhs, mod);
    }


    public static void main(String[] args) {
        calcModulo(Operator.Plus, 1, 2, 10);
        calcModulo(Operator.Plus, 1, 2, 3);
        calcModulo(Operator.Plus, 7, 3, 10);
        calcModulo(Operator.Plus, 11, 12, 10);
        calcModulo(Operator.Minus, 3, 2, 10);
        calcModulo(Operator.Minus, 2, 3, 10);
        calcModulo(Operator.Times, 2, 3, 10);
        calcModulo(Operator.Times, 11, 12, 10);
        calcModulo(Operator.Times, 18, 39, 10);
        calcModulo(Operator.Divide, 1, 2, 11);
        calcModulo(Operator.Divide, 2, 18, 11);
    }
}

Index

Feed

Other

Link

Pathtraq

loading...