やりたいこと
2つのn桁の数字の積から作られる最大の回文数を求めたい
やったこと
例題
2つの2桁の数字の積から作られる最大の回文数は、9009 = 91×99です。
2つの3桁の数字の積から作られる最大の回文数を求めよ。
上記課題は解けたので学習のためにn桁対応させようとしたところ、4桁までは約15秒で結果が出るように作れました。
しかし5桁になると処理が重すぎて途中で中断せざるを得ない状況です。
何かしら改善出来そうなアドバイスなど頂ければ幸いです。
java
1 public static void main(String[] args) { 2 3 // func(2);//1秒以内 4 // func(3);//1秒以内 5 6 func(4);//約15秒 7 8 // func(5);//????秒//2桁分増加の単純計算で15*100=1500秒=25分?? 9 10 } 11
java
1 static void func(int length) { 2 3 String a = "";//文字列操作用:桁A 4 String b = "";//文字列操作用:桁B 5 String s = "";//文字列操作用:回文数 6 7 int maxA = 0;//暫定最大数:桁A 8 int maxB = 0;//暫定最大数:桁B 9 int maxS = 0;//暫定最大数:回文数 10 11 //ループ範囲用 12 int iMax = (int) Math.pow(10, (length)) - 1;//4桁なら=9999 13 int iMin = (int) Math.pow(10, (length - 1));//4桁なら=1000 14 15 //文字列操作用 16 int n = 0; 17 18 for (int i = iMax; i >= iMin; i--) { 19 20 for (int j = iMax; j >= iMin; j--) { 21 22 s = String.valueOf(i * j); 23 24 //対象外をスルー 25 if (s.length() % 2 == 1 || s.length() < length*2) { 26 continue; 27 } 28 29 n = s.length(); 30 31 a = s.substring(0, n / 2);//前半桁を文字列で取得//123321なら123 32 33 b = ""; 34 35 //後半桁を文字列で取得//123321なら321 36 for (int k = 0; k < n / 2; k++) { 37 b += s.substring(n - (k + 1), n - k); 38 } 39 40 //回文数か判定 41 if (a.equals(b)) { 42 43 //暫定最大回文数発見時 44 if (maxS < i * j) { 45 46 maxA = i; 47 maxB = j; 48 maxS = i * j; 49 50 //途中経過 51 System.out.println(maxA + " * " + maxB + " = " + maxS); 52 } 53 } 54 } 55 } 56 //最終結果 57 System.out.println("最終結果"); 58 System.out.println(maxA + " * " + maxB + " = " + maxS); 59 } 60
出力例 func(3);の場合
995 * 583 = 580085
993 * 913 = 906609
最終結果
993 * 913 = 906609
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/09 21:21
2018/08/10 05:50