我试图解决项目欧拉问题4,它是:
回文数字两种方式相同.由两个2位数字的乘积制成的最大回文是9009 = 91×99.找到由两个3位数字的乘积制成的最大回文.
这是我的解决方案,它的输出是997799,但这不是正确的答案,我想知道问题出在哪里:
package projecteuler;
public class Pro4 {
public static void main(String[] args) {
for(int i=999*999;i>=100*100;i--){
if(isPalindrome(i)==true){
System.out.println(i);
break;
}
}
}
static boolean isPalindrome(int x){
int[] bits = new int[7];
int index=1;
while(x>0){
bits[index]=x%10;
index++;
x/=10;
}
for(int i=1;i<=index/2;i++){
if(bits[i]!=bits[index-i]){
return false;
}
}
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个不会遍历所有6位数字的解决方案:
public static boolean isPalindrome(int nr) {
int rev = 0; // the reversed number
int x = nr; // store the default value (it will be changed)
while (x > 0) {
rev = 10 * rev + x % 10;
x /= 10;
}
return nr == rev; // returns true if the number is palindrome
}
public static void main(String[] args) {
int max = -1;
for ( int i = 999 ; i >= 100 ; i--) {
for (int j = 999 ; j >= 100 ; j-- ) {
int p = i * j;
if ( max < p && isPalindrome(p) ) {
max = p;
}
}
}
System.out.println(max > -1? max : "No palindrome found");
}
Run Code Online (Sandbox Code Playgroud)
编辑:
该方法的改进解决方案main(根据Peter Schuetze)可以是:
public static void main(String[] args) {
int max = -1;
for ( int i = 999 ; i >= 100 ; i--) {
if ( max >= i*999 ) {
break;
}
for (int j = 999 ; j >= i ; j-- ) {
int p = i * j;
if ( max < p && isPalindrome(p) ) {
max = p;
}
}
}
System.out.println(max > -1? max : "No palindrome found");
}
Run Code Online (Sandbox Code Playgroud)
对于这个特殊的例子,时间大约是2倍,但如果你的数字更大,那么改进将更加显着.
输出:
906609
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16449 次 |
| 最近记录: |