回答編集履歴

2

コード改良

2019/05/04 05:31

投稿

jimbe
jimbe

スコア13318

test CHANGED
@@ -28,13 +28,15 @@
28
28
 
29
29
 
30
30
 
31
- System.out.println(" a="+toString(a, c.length));
31
+ int width = max(a.length, b.length, c.length, d.length);
32
32
 
33
- System.out.println(" b="+toString(b, c.length));
33
+ System.out.println(" a="+toString(a, width));
34
34
 
35
- System.out.println("a+b="+toString(c, c.length));
35
+ System.out.println(" b="+toString(b, width));
36
36
 
37
+ System.out.println("a+b="+toString(c, width));
38
+
37
- System.out.println("a-b="+toString(d, c.length));
39
+ System.out.println("a-b="+toString(d, width));
38
40
 
39
41
  }
40
42
 
@@ -62,7 +64,7 @@
62
64
 
63
65
  }
64
66
 
65
- return c;
67
+ return pack(c);
66
68
 
67
69
  }
68
70
 
@@ -80,29 +82,43 @@
80
82
 
81
83
  }
82
84
 
83
- return c;
85
+ return pack(c);
84
86
 
85
87
  }
86
88
 
87
- private static String toString(int[] v, int size) {
89
+ private static int[] pack(int[] a) {
88
90
 
89
- StringBuilder s = new StringBuilder(v.length);
91
+ if(a[0] != 0) return a;
90
92
 
91
- boolean printZero = false;
93
+ int i = 0;
92
94
 
93
- for(int i=0; i<v.length; i++) {
95
+ while(++i < a.length-1) if(a[i] != 0) break;
94
96
 
95
- if(v[i] > 0 || printZero) {
97
+ int[] b = new int[a.length-i];
96
98
 
97
- s.append(v[i]);
99
+ System.arraycopy(a, i, b, 0, b.length);
98
100
 
99
- printZero = true;
101
+ return b;
100
102
 
101
- }
103
+ }
102
104
 
103
- }
105
+ private static int max(int... values) {
104
106
 
107
+ int v = values[0];
108
+
109
+ for(int i=1; i<values.length; i++) if(v < values[i]) v = values[i];
110
+
111
+ return v;
112
+
113
+ }
114
+
115
+ private static String toString(int[] v, int minWidth) {
116
+
117
+ StringBuilder s = new StringBuilder(Math.max(v.length, minWidth));
118
+
105
- while(s.length() < size) s.insert(0, " ");
119
+ for(int i=v.length; i<minWidth; i++) s.append(' ');
120
+
121
+ for(int e : v) s.append(e);
106
122
 
107
123
  return s.toString();
108
124
 

1

少々改良

2019/05/04 05:31

投稿

jimbe
jimbe

スコア13318

test CHANGED
@@ -20,13 +20,13 @@
20
20
 
21
21
  int[] b = toIntArray("1254987562015987453");
22
22
 
23
-
23
+
24
24
 
25
25
  int[] c = addition(a, b);
26
26
 
27
27
  int[] d = subtraction(a, b);
28
28
 
29
-
29
+
30
30
 
31
31
  System.out.println(" a="+toString(a, c.length));
32
32
 
@@ -50,17 +50,13 @@
50
50
 
51
51
  private static int[] addition(int[] a, int[] b) {
52
52
 
53
- int ai = a.length - 1;
53
+ int[] c = new int[Math.max(a.length, b.length) + 1];
54
54
 
55
- int bi = b.length - 1;
55
+ for(int ai=a.length-1, bi=b.length-1, ci=c.length-1, carry=0; ci>=0; ai--, bi--, ci--) {
56
56
 
57
- int[] c = new int[(a.length < b.length ? b.length : a.length) + 1];
57
+ int v = (ai >= 0 ? a[ai] : 0) + (bi >= 0 ? b[bi] : 0) + carry;
58
58
 
59
- for(int ci=c.length-1, carry=0; ci>=0; ci--) {
60
-
61
- int v = (ai >= 0 ? a[ai--] : 0) + (bi >= 0 ? b[bi--] : 0) + carry;
62
-
63
- carry = v / 10;
59
+ carry = v > 9 ? 1 : 0;
64
60
 
65
61
  c[ci] = v % 10;
66
62
 
@@ -72,15 +68,11 @@
72
68
 
73
69
  private static int[] subtraction(int[] a, int[] b) {
74
70
 
75
- int ai = a.length - 1;
71
+ int[] c = new int[Math.max(a.length, b.length) + 1];
76
72
 
77
- int bi = b.length - 1;
73
+ for(int ai=a.length-1, bi=b.length-1, ci=c.length-1, borrow=0; ci>=0; ai--, bi--, ci--) {
78
74
 
79
- int[] c = new int[(a.length < b.length ? b.length : a.length) + 1];
80
-
81
- for(int ci=c.length-1, borrow=0; ci>=0; ci--) {
82
-
83
- int v = (ai >= 0 ? a[ai--] : 0) - (bi >= 0 ? b[bi--] : 0) - borrow;
75
+ int v = (ai >= 0 ? a[ai] : 0) - (bi >= 0 ? b[bi] : 0) - borrow;
84
76
 
85
77
  borrow = v < 0 ? 1 : 0;
86
78
 
@@ -102,7 +94,7 @@
102
94
 
103
95
  if(v[i] > 0 || printZero) {
104
96
 
105
- s.append(""+v[i]);
97
+ s.append(v[i]);
106
98
 
107
99
  printZero = true;
108
100