我已经为问题4 @ https://projecteuler.net/problem=4
编写了代码以下是问题:
回文数字两种方式相同。最大的回文 由两个2位数字的乘积制成的9009 = 91×99。
找到由两个3位数的产品制成的最大的回文 号。
这是我的代码
我测试了它,对于第一个循环,它迭代2次(对于i = 100和101),对于第二个循环,它迭代到991(j = 991)
您可以查看我的代码并帮我找出问题所在吗?
public class Main
{
public static void main (String [] args)
{
int resultMult =0;
String strResultMult = "";
String even1stHalf = "";
String even2ndHalf = "";
String maxPalindromEven = "";
String odd1stHalf = "";
String odd2ndHalf = "";
String maxPalindromOdd = "";
for (int i=100;i<=999;i++)
{
for(int j=100;j<=999;j++)
{
resultMult = i*j;
strResultMult = String.valueOf(resultMult);
if(strResultMult.length()%2==0)
{
for (int k=0;k<strResultMult.length()/2 ;i++)
{
even1stHalf = even1stHalf + strResultMult.charAt(k);
}
for (int l=strResultMult.length()-1;l>=strResultMult.length()/2;l--)
{
even2ndHalf = even2ndHalf + strResultMult.charAt(l);
}
if(even1stHalf.equals(even2ndHalf))
{
maxPalindromEven = strResultMult;
}
}
else
{
for (int m=0;m<strResultMult.length()/2 ;m++)
{
odd1stHalf = odd1stHalf + strResultMult.charAt(m);
}
for (int n=strResultMult.length()-1;n>strResultMult.length()/2 ;n--)
{
odd2ndHalf = odd2ndHalf + strResultMult.charAt(n);
}
if(odd1stHalf.equals(odd2ndHalf))
{
maxPalindromOdd = strResultMult;
}
}
}
}
}
}
答案 0 :(得分:0)
而不是:
for (int k=0;k<strResultMult.length()/2 ;i++)
^
我相信你的意思是写:
for (int k=0;k<strResultMult.length()/2 ;k++)
^
答案 1 :(得分:0)
代码分解使问题更容易进行调试:
private static boolean isPalindrome(String value) {
if (null == value)
return false;
for (int i = 0; i < value.length() / 2; ++i)
if (value.charAt(i) != value.charAt(value.length() - 1 - i))
return false;
return true;
}
...
public static void main (String [] args) {
int max = 0;
for (int i = 100; i <= 999; ++i)
for (int j = i; j <= 999; ++j) { // i*j == j*i so you can start from i
int product = i * j;
if ((product > max) && isPalindrome(String.valueOf(product)))
max = product;
}
...
答案 2 :(得分:0)
你可以尝试这个。它显示最大的3位数回文数: -
class Pal{
boolean pal(int no){
int d=no,rev=0;
while(d>0){
rev=(rev*10)+(d%10);
d/=10;
}
boolean bo=(rev==no)?true:false;
return bo;
}
void show(){
int max=0,num=0,mock=0;
for(int i=100;i<1000;i++){
for(int j=100;j<1000;j++){
num=(i*j);
mock=num;
if(pal(mock)==true)
max=num;
}
}
System.out.println("Largest Palindrome:-"+max);
}
}
答案 3 :(得分:0)
试图测试你的解决方案,但同时仍在处理我的代码,当我尝试比较两个字符串时,似乎在if循环中被打破
if(even1stHalf.equals(even2ndHalf))
{
maxPalindromEven = even1stHalf+even2ndHalf;
//System.out.println(even1stHalf+even2ndHalf);
}
和
if(odd1stHalf.equals(odd2ndHalf))
{
maxPalindromOdd = odd1stHalf+odd2ndHalf;
//System.out.println(odd1stHalf+odd2ndHalf);
}
答案 4 :(得分:0)
除了你的编程问题,我会评论你的算法。基本上,您将乘以两个数字(100=<number< 1000)
的所有可能性,并检查每个产品,如果它是回文,也与预先存储的最大回文进行比较。我不认为这是解决问题的有效方法。
我们如何相反地思考,从最大的回文(999999),检查每个回文,直到找到一个可以乘以范围[100,1000)
中的两个数字的那个?
所以基本上是一个外部循环:
loop n in 999 -100
build string n = n + reverse(n) // here we have palindrome
//check if there are two factors of n,
//which fall in range [100,999]
sqrtRoot = sqrt(n)
if sqrtRoot is integer, we found the factor, n is the number
else
a=b=sqrtRoot
while(a<1000 and b > 99)
if a*b==n
factors = [a,b]
break
else if a*b >n
b--
else // here is the a*b<n case
a++
//here we have the factors, found or not found.
// if we found factor, n is the largest number