回答編集履歴

5

余計な } を削除(3か所)

2020/10/03 23:53

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -284,8 +284,6 @@
284
284
 
285
285
  }
286
286
 
287
- }
288
-
289
287
  ```
290
288
 
291
289
  次に積(product)の総和(sum)を求めるコードを追加します。
@@ -354,8 +352,6 @@
354
352
 
355
353
  }
356
354
 
357
- }
358
-
359
355
  ```
360
356
 
361
357
  **追記2**
@@ -390,8 +386,6 @@
390
386
 
391
387
  }
392
388
 
393
- }
394
-
395
389
  ```
396
390
 
397
391
  sum の最後の2桁については、ちょっと違うやり方にしてみました。

4

char[] ではなく String を使うコードを追加

2020/10/03 23:53

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -357,3 +357,41 @@
357
357
  }
358
358
 
359
359
  ```
360
+
361
+ **追記2**
362
+
363
+ 「効率」とか「ひらめき」とかはよくないですね。
364
+
365
+ char[] out ではなく、素直に String out を使うコードを示します。
366
+
367
+ ```Java
368
+
369
+ public String encrypt(String str) {
370
+
371
+ int[] mul = { 1, 3, 7, 9, 7, 3, 1, 3, 9, 7, 1 };
372
+
373
+ String out = "";
374
+
375
+ int sum = 0;
376
+
377
+ for (int i = 0; i < 11; i++) {
378
+
379
+ int product = (str.charAt(i) - '0') * mul[i];
380
+
381
+ sum += product;
382
+
383
+ out += (char)(product % 10 + '0');
384
+
385
+ }
386
+
387
+ String t = "0987654321";
388
+
389
+ return out + t.charAt(sum / 10 % 10) + t.charAt(sum % 10);
390
+
391
+ }
392
+
393
+ }
394
+
395
+ ```
396
+
397
+ sum の最後の2桁については、ちょっと違うやり方にしてみました。

3

indent の再修正

2020/10/03 15:38

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -334,7 +334,7 @@
334
334
 
335
335
  for (int i = 0; i < 11; i++) {
336
336
 
337
- int product = (out[i] - '0') * mul[i];
337
+ int product = (out[i] - '0') * mul[i];
338
338
 
339
339
  out[i] = (char)(product % 10 + '0');
340
340
 

2

インデントの修正

2020/10/03 13:50

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -296,7 +296,7 @@
296
296
 
297
297
  for (int i = 0; i < 11; i++) {
298
298
 
299
- int product = (out[i] - '0') * mul[i];
299
+ int product = (out[i] - '0') * mul[i];
300
300
 
301
301
  out[i] = (char)(product % 10 + '0');
302
302
 

1

「日本語にする」とはどういうことかを追加

2020/10/03 13:49

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -159,3 +159,201 @@
159
159
  }
160
160
 
161
161
  ```
162
+
163
+ **追記**
164
+
165
+ やりたいことを次のような日本語で書いたとします。
166
+
167
+ ```text
168
+
169
+ ・文字列を変換して新しい文字列を作る。
170
+
171
+ ・入力文字列は、11個の数字である。
172
+
173
+ ・出力文字列は、13個の数字である。
174
+
175
+ ・変換表 { 1, 3, 7, 9, 7, 3, 1, 3, 9, 7, 1 } が用意されている。
176
+
177
+ ・入力文字列の各数字について、その値に変換表の同じ位置の値を掛け算して積を作る。
178
+
179
+ ・その積の一の位の数を出力文字の各文字とする。
180
+
181
+ ・また、その積の総和を求め、十の位の値を A、一の位の値を B とする。
182
+
183
+ ・A も B も 0 でなければ、それらの値を 10 - A、10 - B の値に置き換える。
184
+
185
+ ・A と B を出力文字の 12文字目と 13文字目とする。
186
+
187
+ ```
188
+
189
+ プログラミング言語を知らない人でも、
190
+
191
+ この手順書にしたがって、やりたいことができると思いませんか?
192
+
193
+
194
+
195
+ さて、これを Java のプログラムに変換します。
196
+
197
+
198
+
199
+ メソッド名は何でもいいんですが、暗号化だから encrypt にしましょう。
200
+
201
+ 入出力が文字列だから、`String encrypt(String str) {` で始めます。
202
+
203
+
204
+
205
+ 変換表は数値の並びなので、`int[] mul = { 1, 3, 7, ..., 1 }` です。
206
+
207
+ 掛け算に使うので multiply から mul にしましたが、何でもいいです。
208
+
209
+
210
+
211
+ 出力文字列をどうやって作るか考えないといけません。
212
+
213
+ String out = ""; と空の文字列を用意し、ここに変換後の各文字を追加していく
214
+
215
+ こともできますが、文字列の連結は効率が悪いので、
216
+
217
+ char[] out = new char[11]; のように char の配列を用意して、その各要素に
218
+
219
+ 文字を入れていき、最後に out を String に変換しましょう。
220
+
221
+
222
+
223
+ 入力文字列から各文字を取り出して整数値にするのをどうするか考えないといけません。
224
+
225
+ ```Java
226
+
227
+ for (int i = 0; i < 11; i++) {
228
+
229
+ int val = str.charAt(i) - '0';
230
+
231
+ この val を変換して out[i] に入れる。
232
+
233
+ }
234
+
235
+ ```
236
+
237
+ 次のようにも書けますが、これより上のコードの方が簡単でしょう。
238
+
239
+ ```Java
240
+
241
+ for (int i = 0; i < 11; i++) {
242
+
243
+ int val = Integer.parseInt(str.substring(i, i+1));
244
+
245
+ この val を変換して out[i] に入れる。
246
+
247
+ }
248
+
249
+ ```
250
+
251
+ ここで次ようなことがひらめきました。
252
+
253
+ String である入力文字列 str を char[] にしておけば、
254
+
255
+ charAtメソッドの呼び出しをせずに配列要素として文字を取り出せます。
256
+
257
+ それには出力文字列用の out が流用できます。
258
+
259
+ `char[] out = str.toCharArray():` とすればいいんです。
260
+
261
+ こうすれば、out[i] から取り出した文字を変換して out[i] に戻すだけです。
262
+
263
+
264
+
265
+ ここまで考えれば、次のようなコードが書けます。
266
+
267
+ ```Java
268
+
269
+ public String encrypt(String str) {
270
+
271
+ int[] mul = { 1, 3, 7, 9, 7, 3, 1, 3, 9, 7, 1 };
272
+
273
+ char[] out = str.toCharArray();
274
+
275
+ for (int i = 0; i < 11; i++) {
276
+
277
+ int product = (out[i] - '0') * mul[i];
278
+
279
+ out[i] = (char)(product % 10 + '0');
280
+
281
+ }
282
+
283
+ return String.valueOf(out);
284
+
285
+ }
286
+
287
+ }
288
+
289
+ ```
290
+
291
+ 次に積(product)の総和(sum)を求めるコードを追加します。
292
+
293
+ ```Java
294
+
295
+ int sum = 0;
296
+
297
+ for (int i = 0; i < 11; i++) {
298
+
299
+ int product = (out[i] - '0') * mul[i];
300
+
301
+ out[i] = (char)(product % 10 + '0');
302
+
303
+ sum += product;
304
+
305
+ }
306
+
307
+ ```
308
+
309
+ 積の総和の十の位と一の位の値を求めるコードは
310
+
311
+ ```Java
312
+
313
+ int a = sum / 10 % 10;
314
+
315
+ if (a != 0) a = 10 - a;
316
+
317
+ int b = sum % 10;
318
+
319
+ if (b != 0) b = 10 - b;
320
+
321
+ ```
322
+
323
+ 全部をまとめて、
324
+
325
+ ```Java
326
+
327
+ public String encrypt(String str) {
328
+
329
+ int[] mul = { 1, 3, 7, 9, 7, 3, 1, 3, 9, 7, 1 };
330
+
331
+ char[] out = str.toCharArray();
332
+
333
+ int sum = 0;
334
+
335
+ for (int i = 0; i < 11; i++) {
336
+
337
+ int product = (out[i] - '0') * mul[i];
338
+
339
+ out[i] = (char)(product % 10 + '0');
340
+
341
+ sum += product;
342
+
343
+ }
344
+
345
+ int a = sum / 10 % 10;
346
+
347
+ if (a != 0) a = 10 - a;
348
+
349
+ int b = sum % 10;
350
+
351
+ if (b != 0) b = 10 - b;
352
+
353
+ return String.valueOf(out) + a + b;
354
+
355
+ }
356
+
357
+ }
358
+
359
+ ```