Java
1package test; 2class nouNum { 3 public String Num01(String in){ 4 char[] out = in.toCharArray(); 5 int[] mul = { 1, 3, 7, 9, 7, 3, 1, 3, 9, 7, 1 }; 6 int n = Math.min(out.length, 11); 7 for (int i = 0; i < n; i++) 8 out[i] = (char)((out[i] - '0') * mul[i] % 10 + '0'); 9 return new String(out); 10 } 11} 12 13package test; 14 15public class test01 { 16public static void main(String[] args) { 17 nouNum test01 = new nouNum(); 18System.out.println(test01.Num01("20092812345")); 19 } 20} 21 22実行結果→ 20014416785
やりたいこと
引数 20092812345 → 2001441678522 としたい。
20092812345 * { 1, 3, 7, 9, 7, 3, 1, 3, 9, 7, 1 } = 2(21) , 0(03), 0(07), 81(99), 14(27), 24(83), 1(11),
6(23), 27(39), 28(47),5(5*1)
↓
2 + 0 + 0 + 81 + 14 + 24 + 1 + 6 + 27 + 28 +5 = 188
188 → 百の位は無視する。
十の位はマイナス10する。
一の位はマイナス10する。
上記の計算式を実現するにはどうしたらいいか教えて頂きたいです。
Java
1public class test11 { 2 3 public static void main(String[] args) { 4 // TODO 自動生成されたメソッド・スタブ 5 6 class nouNum { 7 //引数で"20092812345"(inData)を受け取る 8 public String test(String inData){ 9 //引数で受け取る変数をchar[]で作成する 10 char[] no02 = inData.toCharArray(); 11 //no02の値の桁を1桁づつ取り出して掛けるための配列の変数を作成する 12 int[] mul = { 1, 3, 7, 9, 7, 3, 1, 3, 9, 7, 1 }; 13 //引数の値の11桁目まで計算するための変数を作成する。 14 int n = Math.min(no02.length, 11); 15 //引数の値と1文字づつ取得した桁に対して掛けた値の合計値を保持するための変数を作成する 16 int total = 0; 17 //引数の値を1文字づつ取り出す 18 for (int i = 0; i < n; i++) 19 //数字を数値に変換して掛けたものを配列に入れる 20 total = (char)((no02[i] - '0') * mul[i] + '0'); 21 //掛けた値の1の位の値を入れる変数の箱を作成する 22 char[] no03 = (char)((no02[i]- '0') mul[i] % 10 + '0'); 23 //合計から10の位を取り出して10からその値を引いた値にする 24 int a = total.getNumbericValue(i); 25 //10の位を取り出す 26 int a01 = a / 10 % 10; 27 //ただし10は変換しない 28 if(a01 != 0) a01 = 10 -a01; 29 //合計から1の位を取り出し10からその値を引いた値にする 30 int b = total.getNumbericValue(i); 31 //1の位を取り出す 32 int b01 = total % 10; 33 //ただし0は変換しない 34 if(b01 != 0) b01 = 10 -b01; 35 //掛けた値の1の位だけ表示した値をint型に変換する 36 int c = no03.getNumbericValue(i); 37 //returnしたい値の変数の箱を作る 38 int Num01 = c + a01 + b01; 39 40 return String.valueOf(Num01); 41 } 42 } 43 44 } 45}
理解と分解を頂いたアドバイスを元に自分なりに作成してみたのですが、ものすごく長いコードになってしまいました。
この理解と分解の仕方は検討ちがいでしょうか?
アドバイス頂けないでしょうか?
分解
1、
予約受付番号を暗号化計算ロジックにより暗号化し、他者からの不正なアクセスや情報漏洩から守るための
セキュリティ対策をする。
2、
扱うデータ : 予約受付番号データ
暗号化した予約受付番号データ
暗号化するための計算ロジックデータ
機能 : 繰り返し(for)
型の変換 //機能として入れていいのか不明
代入 //機能として入れていいのか不明
条件式(if)
計算式1 (掛け算した結果の1の位の剰余算)
計算式2 (掛け算、足し算、1の位と10の位の剰余算、引き算)
3-1、 大きく6項目
➊ ・引数(予約受付番号データ)
➋ ・for(1つづつ予約受付番号データの数字を取り出す)
➌ ・(予約受付番号データ)×(暗号化するための計算ロジックデータ)
➍ ・掛け算した値の合計を求める
➎ (暗号化計算式1⃣)
・(掛け算した値の1の位のみ並べる) = (取り出した予約受付番号データ)×(暗号化するための計算ロジックデータ);
➏ (暗号化計算式2⃣)
・合計した値の1の位を剰余算する
10引く(1の位を剰余算した値)
もし0なら0とする
・合計した値の10の位を剰余算する
10引く(10の位を剰余算した値)
もし0なら0とする
➐ ・(暗号化計算式1⃣)と(暗号化計算式2⃣)を結合する
3-2、 6項目の細分化
➊ public String method(予約受付番号データ){
//char配列の箱で受け取る
char[] (予約受付番号データを入れる箱) = (予約受付番号データ);
➋ //(予約受付番号データを入れる箱)から1つづつ数字を取り出す
for((予約受付番号データを入れる箱)から1つづつ数字を取り出す)
➌➍ //(取り出した予約受付番号データ)×(暗号化するための計算ロジックデータ)
(掛け算した値の合計) = (取り出した予約受付番号データ)×(暗号化するための計算ロジックデータ);
➎ //暗号化計算式1⃣
(掛け算した値の1の位のみ並べる) = (取り出した予約受付番号データ)×(暗号化するための計算ロジックデータ);
➏ //暗号化計算式2⃣
//合計した値の1の位を剰余算する
(1の位を剰余算) = (掛け算した値の合計) % 10;
// もし0の場合は0とする
if( (右の計算結果) != 0);
// 10からその値を引く
(右の計算結果A) = 10 - (1の位を剰余算);
//合計した値の1の位を剰余算する
(10の位を剰余算) = (掛け算した値の合計) / 10 % 10;
// もし0の場合は0とする
if( (右の計算結果) != 0);
// 10からその値を引く
(右の計算結果B) = 10 - (1の位を剰余算);
➐ // (暗号化計算式1⃣) (暗号化計算式2⃣)
(暗号化した予約受付番号) = (1の位を剰余算) + ((右の計算結果A) + (右の計算結果B));
3-3 コードのみ
➊ public String test(String inData){
int[] mul = { 1, 3, 7, 9, 7, 3, 1, 3, 9, 7, 1 };
char[] yoyakuNo = inData.toCharArray();
➋ for(int i=0; i<yoyakuNo; i++)
➌➍ int kaketaTotal= yoyakuNo × mul;
➎ int lastKeta = (yoyakuNo × mul) % 10;
➏ totalA = kaketaTotal % 10;
if(total != 0){
10 - total;
}
totalB = kaketaTotal / 10 % 10;
if(total != 0){
10 - total;
}
➐ int anngoukaYoyakuNo = lastKeta + (totalA + totalB);
return new String(anngoukaYoyakuNo);
}
理解と分解のアドバイスの元修正いたしましたが、コードが短くなった気がしましたが、
エラーが出てしまい、動作まではいきませんでした。
エラー → トークンに構文エラーがあります。これらのトークンを削除してください
理解と分解という点でこちらの流れですが、改善点などアドバイス頂きたいですm(__)m
文が長くなってしまい申し訳ありません。。
回答3件
あなたの回答
tips
プレビュー