Java 最大回文产品-euler项目
我试图解决Euler项目,即: 回文数字的两种读取方式相同。由两个两位数的乘积构成的最大回文是9009=91×99。 查找由两个3位数字的乘积构成的最大回文。 这是我的解决方案,它的输出是997799,但这不是正确的答案,我想知道问题出在哪里:Java 最大回文产品-euler项目,java,palindrome,Java,Palindrome,我试图解决Euler项目,即: 回文数字的两种读取方式相同。由两个两位数的乘积构成的最大回文是9009=91×99。 查找由两个3位数字的乘积构成的最大回文。 这是我的解决方案,它的输出是997799,但这不是正确的答案,我想知道问题出在哪里: package projecteuler; public class Pro4 { public static void main(String[] args) { for(int i=999*999;i>=100*1
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;
}
}
package;
公共类Pro4{
公共静态void main(字符串[]args){
对于(int i=999*999;i>=100*100;i--){
if(isAlindrome(i)=真){
系统输出打印LN(i);
打破
}
}
}
静态布尔值isAlindrome(int x){
int[]位=新的int[7];
int指数=1;
而(x>0){
位[索引]=x%10;
索引++;
x/=10;
}
对于(int i=1;i您正在按顺序将i从999*999递减到100*100。这并不一定意味着您找到的第一个回文是两个3位数的乘积
回文997799包含11和90709作为基本因子,这不是两个3位数的乘积。您将i从999*999顺序递减到100*100。这并不一定意味着您找到的第一个回文是两个3位数的乘积
回文997799有11和90709作为基本因子,它们不是两个3位数字的乘积。for循环从998001运行到100000。i
的for循环从998001运行到100000。在您的程序中没有任何地方检查i
实际上可以是两个3位数字的乘积。for循环从998001运行到i
到100000。您的程序中没有任何地方检查i
实际上可以是两个3位数字的乘积。您正在迭代编号为998001到10000的循环,因为某些数字可能不是两个3位数字的乘积。
您应该将两个3位数字相乘,然后比较该数字是否为回文
for循环代码应为:
for(int i=999;i>=100;i--)
{
int k = i-1;
int product = i * k;
System.out.println(i+" * "+k+" = "+product);
if(isPalindrome(product)==true){
System.out.println("palindrum number "+product);
System.out.println("Product of : "+i+" * "+k);
break;
}
}
for(int i=999;i>=100;i--){
int k = i;
int product = i * k;
System.out.println(i+" * "+k+" = "+product);
if(isPalindrome(product)==true){
System.out.println("palindrum number "+product);
System.out.println("Product of : "+i+" * "+k);
break;
}
else{
k = i - 1;
product = i * k;
System.out.println(i+" * "+k+" = "+product);
if(isPalindrome(product)==true){
System.out.println("palindrum number "+product);
System.out.println("Product of : "+i+" * "+k);
break;
}
}
}
这将给出最大回文数,其中的回文数是两个3位数的乘积。
输出为:
palindrum number 289982
Product of : 539 * 538
如果两个数字在相乘时不同,则为真。
如果您希望包含相同编号的产品以检查是否有回文,则上述代码中可能没有什么变化。
为此,代码应为:
for(int i=999;i>=100;i--)
{
int k = i-1;
int product = i * k;
System.out.println(i+" * "+k+" = "+product);
if(isPalindrome(product)==true){
System.out.println("palindrum number "+product);
System.out.println("Product of : "+i+" * "+k);
break;
}
}
for(int i=999;i>=100;i--){
int k = i;
int product = i * k;
System.out.println(i+" * "+k+" = "+product);
if(isPalindrome(product)==true){
System.out.println("palindrum number "+product);
System.out.println("Product of : "+i+" * "+k);
break;
}
else{
k = i - 1;
product = i * k;
System.out.println(i+" * "+k+" = "+product);
if(isPalindrome(product)==true){
System.out.println("palindrum number "+product);
System.out.println("Product of : "+i+" * "+k);
break;
}
}
}
这将为您提供如下输出:
palindrum number 698896
Product of : 836 * 836
我认为这就是您需要做的。您正在迭代编号为998001到10000的循环,因为有些数字可能不是两个三位数的乘积。
您应该将两个3位数字相乘,然后比较该数字是否为回文
for循环代码应为:
for(int i=999;i>=100;i--)
{
int k = i-1;
int product = i * k;
System.out.println(i+" * "+k+" = "+product);
if(isPalindrome(product)==true){
System.out.println("palindrum number "+product);
System.out.println("Product of : "+i+" * "+k);
break;
}
}
for(int i=999;i>=100;i--){
int k = i;
int product = i * k;
System.out.println(i+" * "+k+" = "+product);
if(isPalindrome(product)==true){
System.out.println("palindrum number "+product);
System.out.println("Product of : "+i+" * "+k);
break;
}
else{
k = i - 1;
product = i * k;
System.out.println(i+" * "+k+" = "+product);
if(isPalindrome(product)==true){
System.out.println("palindrum number "+product);
System.out.println("Product of : "+i+" * "+k);
break;
}
}
}
这将给出最大回文数,其中的回文数是两个3位数的乘积。
输出为:
palindrum number 289982
Product of : 539 * 538
如果两个数字在相乘时不同,则为真。
如果您希望包含相同编号的产品以检查是否有回文,则上述代码中可能没有什么变化。
为此,代码应为:
for(int i=999;i>=100;i--)
{
int k = i-1;
int product = i * k;
System.out.println(i+" * "+k+" = "+product);
if(isPalindrome(product)==true){
System.out.println("palindrum number "+product);
System.out.println("Product of : "+i+" * "+k);
break;
}
}
for(int i=999;i>=100;i--){
int k = i;
int product = i * k;
System.out.println(i+" * "+k+" = "+product);
if(isPalindrome(product)==true){
System.out.println("palindrum number "+product);
System.out.println("Product of : "+i+" * "+k);
break;
}
else{
k = i - 1;
product = i * k;
System.out.println(i+" * "+k+" = "+product);
if(isPalindrome(product)==true){
System.out.println("palindrum number "+product);
System.out.println("Product of : "+i+" * "+k);
break;
}
}
}
这将为您提供如下输出:
palindrum number 698896
Product of : 836 * 836
我认为这就是您需要做的。这里有一个解决方案,它不会遍历所有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");
}
对于这个特定的例子,时间大约是原来的2倍,但是如果你有更大的数字,改善会更显著
输出:
906609
以下是一个不会遍历所有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");
}
对于这个特定的例子,时间大约是原来的2倍,但是如果你有更大的数字,改善会更显著
输出:
906609
你还假设你找到的第一个回文是最大的,你找到的第一个回文是580085,这不是正确的答案
您还假设找到的第一个回文是两个3位数字的乘积。您还应该使用两个不同的数字,而不是将999乘以999并向下迭代到100*100。您还假设找到的第一个回文是最大的。您找到的第一个回文是580085,这是这不是正确的答案
您还假设您将找到的第一个回文是两个3位数字的乘积。您还应该使用两个不同的数字,而不是将999乘以999,然后向下迭代到100*100。以上似乎都没有给出正确的答案。(我认为逻辑可能是正确的,但正确的答案是906609)。由于您不知道数字是6位还是5位,您需要检查这两个数字。下面是一个简单的代码
乘法是一次到多次调用的,我知道
i = 999
for u in range (100,1000):
for y in range (100,1000):
if len(str(u*y)) == 5 and str(u*y)[0]==str(u*y)[4]and str(u*y)[1]==str(u*y)[3] and u*y>i:
i=u*y
print ('the product of ', u, ' and ',y,' is: ',u*y)
elif len(str(u*y)) == 6 and str(u*y)[0]==str(u*y)[5]and str(u*y)[1]==str(u*y)[4]and str(u*y)[2]==str(u*y)[3]and u*y>i:
i=u*y
print ('the product of ', u, ' and ',y,' is: ',u*y)
上面的这些似乎都没有给出正确的答案。(我认为逻辑可能是正确的,但正确的答案是906609)。由于您不知道数字是6位还是5位,您需要检查这两个数字。下面是一个简单的代码来做同样的事
乘法是一次到多次调用的,我知道
i = 999
for u in range (100,1000):
for y in range (100,1000):
if len(str(u*y)) == 5 and str(u*y)[0]==str(u*y)[4]and str(u*y)[1]==str(u*y)[3] and u*y>i:
i=u*y
print ('the product of ', u, ' and ',y,' is: ',u*y)
elif len(str(u*y)) == 6 and str(u*y)[0]==str(u*y)[5]and str(u*y)[1]==str(u*y)[4]and str(u*y)[2]==str(u*y)[3]and u*y>i:
i=u*y
print ('the product of ', u, ' and ',y,' is: ',u*y)
公共类最大回文生成{
公共静态void main(字符串参数[]){
LargestPalindromProduct obj=新的LargestPalindromProduct();
System.out.println(“两个3位数字乘积的最大回文是”+obj.getLargestPalindromeProduct(3));
}
/*
*@param数字
*@返回
*/
私有整数getLargestPalindromeProduct(整数位数){
int最大回文乘积=-1;
int startNum=(int)Math.pow(10位数字)-1;
int endNum=(int)Math.pow(10,数字-1)-1;
对于(int i=startNum;i>endNum;i--){
对于(int j=startNum;j>endNum;j--){
if(isPalindrome(i*j)){
最大回文积=Math.max(最大回文积,i*j);
}
}
}
返回最大回文量产品;
}
私人布利亚酒店