teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

コード改良

2019/05/04 05:31

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -13,10 +13,11 @@
13
13
  int[] c = addition(a, b);
14
14
  int[] d = subtraction(a, b);
15
15
 
16
+ int width = max(a.length, b.length, c.length, d.length);
16
- System.out.println(" a="+toString(a, c.length));
17
+ System.out.println(" a="+toString(a, width));
17
- System.out.println(" b="+toString(b, c.length));
18
+ System.out.println(" b="+toString(b, width));
18
- System.out.println("a+b="+toString(c, c.length));
19
+ System.out.println("a+b="+toString(c, width));
19
- System.out.println("a-b="+toString(d, c.length));
20
+ System.out.println("a-b="+toString(d, width));
20
21
  }
21
22
  private static int[] toIntArray(String s) {
22
23
  int[] v = new int[s.length()];
@@ -30,7 +31,7 @@
30
31
  carry = v > 9 ? 1 : 0;
31
32
  c[ci] = v % 10;
32
33
  }
33
- return c;
34
+ return pack(c);
34
35
  }
35
36
  private static int[] subtraction(int[] a, int[] b) {
36
37
  int[] c = new int[Math.max(a.length, b.length) + 1];
@@ -39,18 +40,25 @@
39
40
  borrow = v < 0 ? 1 : 0;
40
41
  c[ci] = (v+10) % 10;
41
42
  }
42
- return c;
43
+ return pack(c);
43
44
  }
44
- private static String toString(int[] v, int size) {
45
+ private static int[] pack(int[] a) {
45
- StringBuilder s = new StringBuilder(v.length);
46
- boolean printZero = false;
47
- for(int i=0; i<v.length; i++) {
48
- if(v[i] > 0 || printZero) {
46
+ if(a[0] != 0) return a;
49
- s.append(v[i]);
50
- printZero = true;
47
+ int i = 0;
48
+ while(++i < a.length-1) if(a[i] != 0) break;
49
+ int[] b = new int[a.length-i];
50
+ System.arraycopy(a, i, b, 0, b.length);
51
+ return b;
51
- }
52
+ }
53
+ private static int max(int... values) {
54
+ int v = values[0];
55
+ for(int i=1; i<values.length; i++) if(v < values[i]) v = values[i];
56
+ return v;
52
- }
57
+ }
58
+ private static String toString(int[] v, int minWidth) {
59
+ StringBuilder s = new StringBuilder(Math.max(v.length, minWidth));
53
- while(s.length() < size) s.insert(0, " ");
60
+ for(int i=v.length; i<minWidth; i++) s.append(' ');
61
+ for(int e : v) s.append(e);
54
62
  return s.toString();
55
63
  }
56
64
  }

1

少々改良

2019/05/04 05:31

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -9,10 +9,10 @@
9
9
  public static void main(String[] args) throws Exception {
10
10
  int[] a = toIntArray("1564203541236589741");
11
11
  int[] b = toIntArray("1254987562015987453");
12
-
12
+
13
13
  int[] c = addition(a, b);
14
14
  int[] d = subtraction(a, b);
15
-
15
+
16
16
  System.out.println(" a="+toString(a, c.length));
17
17
  System.out.println(" b="+toString(b, c.length));
18
18
  System.out.println("a+b="+toString(c, c.length));
@@ -24,22 +24,18 @@
24
24
  return v;
25
25
  }
26
26
  private static int[] addition(int[] a, int[] b) {
27
- int ai = a.length - 1;
28
- int bi = b.length - 1;
29
- int[] c = new int[(a.length < b.length ? b.length : a.length) + 1];
27
+ int[] c = new int[Math.max(a.length, b.length) + 1];
30
- for(int ci=c.length-1, carry=0; ci>=0; ci--) {
28
+ for(int ai=a.length-1, bi=b.length-1, ci=c.length-1, carry=0; ci>=0; ai--, bi--, ci--) {
31
- int v = (ai >= 0 ? a[ai--] : 0) + (bi >= 0 ? b[bi--] : 0) + carry;
29
+ int v = (ai >= 0 ? a[ai] : 0) + (bi >= 0 ? b[bi] : 0) + carry;
32
- carry = v / 10;
30
+ carry = v > 9 ? 1 : 0;
33
31
  c[ci] = v % 10;
34
32
  }
35
33
  return c;
36
34
  }
37
35
  private static int[] subtraction(int[] a, int[] b) {
38
- int ai = a.length - 1;
39
- int bi = b.length - 1;
40
- int[] c = new int[(a.length < b.length ? b.length : a.length) + 1];
36
+ int[] c = new int[Math.max(a.length, b.length) + 1];
41
- for(int ci=c.length-1, borrow=0; ci>=0; ci--) {
37
+ for(int ai=a.length-1, bi=b.length-1, ci=c.length-1, borrow=0; ci>=0; ai--, bi--, ci--) {
42
- int v = (ai >= 0 ? a[ai--] : 0) - (bi >= 0 ? b[bi--] : 0) - borrow;
38
+ int v = (ai >= 0 ? a[ai] : 0) - (bi >= 0 ? b[bi] : 0) - borrow;
43
39
  borrow = v < 0 ? 1 : 0;
44
40
  c[ci] = (v+10) % 10;
45
41
  }
@@ -50,7 +46,7 @@
50
46
  boolean printZero = false;
51
47
  for(int i=0; i<v.length; i++) {
52
48
  if(v[i] > 0 || printZero) {
53
- s.append(""+v[i]);
49
+ s.append(v[i]);
54
50
  printZero = true;
55
51
  }
56
52
  }