项目欧拉问题4

时间:2011-08-09 17:20:19

标签: c

我在Project Euler上创建了问题4的解决方案。 但是,我发现将print语句(打印答案)放在不同的位置会打印出不同的答案。由于某种原因,结果的最高值是580085.不应该是906609吗?我的isPalindrome()方法有问题吗?

 #include <stdio.h>
 #include <stdbool.h>

 int isPalindrome(int n);

 //Find the largest palindrome made from the product of two 3-digit numbers.
 int main(void)
 {    
      int i = 0;
      int j = 0;
      int result = 0;
      int palindrome = 0;
      int max = 0;

      //Each iteration of i will be multiplied from j:10-99
      for(i = 100; i <= 999; i++)
      {
            for(j = 100; j <= 999; j++)
            {
                  result = i * j; 
                  if(isPalindrome(result) == 0)
                  {
                       //printf("Largest Palindrome: %d\n", max); //906609
                       //printf("Result: %d\n", result); //580085
                       if(result > max)
                       {
                            max = result;
                            //printf("Largest Palindrome: %d\n", max); //927340
                       }      
                       printf("Largest Palindrome: %d\n", max); //906609
                  }
            }
       } 

       //printf("Largest Palindrome: %d\n", max); //998001

      system("PAUSE");
      return 0;
 } //End of main

 //Determines if number is a palindrome
 int isPalindrome(int num)
 {
      int n = num;
      int i = 0;
      int j = 0;
      int k = 0;
      int count = 0;
      int yes = 0;

      //Determines the size of numArray
      while(n/10 != 0)
      {
           n%10;
           count++;
           n = n/10;
      }

      int numArray[count];

      //Fill numArray with each digit of num
      for(i = 0; i <= count; i++)
      { 
           numArray[i] = num%10;
           //printf("%d\n", numArray[i]);  
           num = num/10;
      }

      //Determines if num is a Palindrome     
      while(numArray[k] == numArray[count])
     {
           k = k + 1;
           count = count - 1;  
           yes++;
      }

      if(yes >= 3)
     {
           return 0; 
      }

}//End of Function

8 个答案:

答案 0 :(得分:4)

我记得前一段时间我正在做这个问题而我只是制作了一个is_palindrome()函数并且强行强迫它。我从999 * 999向下开始测试。

我检测回文的方法与你的不同。我会将给定的数字转换为字符串,并将第一个字符与第n个字符进行比较,第二个字符串与n-1进行比较,依此类推。

这很简单(也可能效率低下),但答案会“立即”出现。

答案 1 :(得分:3)

查找号码时代码没有问题 根据你的代码片段:

.
.
       }      
                       printf("Largest Palindrome: %d\n", max); //906609
                  }
            }
       } 

       //printf("Largest Palindrome: %d\n", max); //998001

      system("PAUSE");
.
.
.

一旦找到回文数字,就会得到结果。

你应该将回文存储在变量max中,并让代码进一步运行,因为有可能进一步找到更大的回文。

请注意,对于i=800,j=500,与i*j相比,i=999,j=100会更大。 只需理解这里的逻辑。

答案 2 :(得分:1)

//Determines if number is a palindrome
 bool isPalindrome(int num)   // Change this to bool
 {
      int n = num;
      int i = 0;
      int j = 0;
      int k = 0;
      int count = 1; // Start counting at 1, to account for 1 digit numbers
      int yes = 0;

  //Determines the size of numArray
  while(n/10 != 0)
  {
       // n%10; <-- What was that all about!
       count++;
       n = n/10;
  }

  int numArray[count];

  //Fill numArray with each digit of num
  for(i = 0; i < count; i++)                 // This will crash if you use index=count; Array indices go from 0 to Size-1
  { 
       numArray[i] = num%10;
       //printf("%d\n", numArray[i]);  
       num = num/10;
  }

  //Determines if num is a Palindrome
  /*     
  while(numArray[k] == numArray[count-1])       // Again count-1 not count; This is really bad though what if you have 111111 or some number longer than 6. It might also go out of bounds
 {
       k = k + 1;
       count = count - 1;  
       yes++;
  }
  */

  for(k = 1; k <= count; k++)
  {
     if(numArray[k-1] != numArray[count-k])
       return false;
  }

  return true;

}//End of Function

这就是我能找到的全部。

您还需要更改此

if(isPalindrome(result) == 0)

if(isPalindrome(result))

进行修改后的代码输出:Link

答案 3 :(得分:1)

isPalindrome函数中的一些问题:

  • 第一个while循环不计算数字中的位数,但计算的数量减少一个。
  • 因此,numArray数组太小(假设您的编译器支持像开始那样创建数组)
  • for循环正在写一个超过数组末尾的值,最好覆盖其他一些(可能很重要的)内存位置。
  • 第二个while循环没有正确定义的结束条件 - 它可以愉快地比较超过数组边界的值。
  • 由于这个原因,yes中的值可能不正确,因此函数的结果也是如此。
  • 如果该功能未检测到回文,则不返回任何内容。

答案 4 :(得分:1)

在遍历所有可能的值之后,正确的printf是for之后的那个

您使用int来存储palidrome的值,但结果大于65536, 你应该使用未签名的

result = i * j;

这段代码错了:

while(n/10 != 0) {
   n%10;
   count++;
   n = n/10;
}

它应该是:

while(n != 0) {
  count++;
  n = n/10;
}

以及P.R sugested的变化。

你可以做这样的事情来确定数字是否为回文:

int isPalindrom(unsigned nr) {

    int i, len;
    char str[10];

    //convert number to string
    sprintf(str, "%d", nr);
    len  = strlen(str);

    //compare first half of the digits with the second half
    // stop if you find two digits which are not equal
    for(i = 0; i < len / 2  && str[i] == str[len - i - 1]; i++);

    return i == len / 2;
}

答案 5 :(得分:1)

我将数字转换为String,因此我可以将数字作为char数组重复:

private static boolean isPalindrom(long num) {
    String numAsStr = String.valueOf(num);
    char[] charArray = numAsStr.toCharArray();
    int length = charArray.length;
    for (int i = 0 ; i < length/2 ; ++i) {
        if (charArray[i] != charArray[length - 1 - i]) return false;
    }
    return true;
}

答案 6 :(得分:0)

我对这个问题得到了正确答案,但我想知道我的编码风格是好还是坏。我需要知道如何改进我的编码,如果它是坏的和更通用的方式。

#include<stdio.h>
#define MAX 999
#define START 100

int main()
{
    int i,j,current,n,prev = 0;
    for(i = START;i<=MAX;i++)
    {
        for(j=START;j<=MAX;j++)
        {
            current = j * i;
            if(current > prev)  /*check the current value so that if it is less need not go further*/
            {
                n = palindrome(current);
                if (n == 1)
                {
                    printf("The palindrome number is : %d\n",current);
                    prev = current;  // previous value is updated if this the best possible value.
                }
            }
        }
    }
}

int palindrome(int num)
{
    int a[6],temp;
    temp = num;
    /*We need a array to store each element*/
    a[5] = temp % 10;       
    a[4] = (temp/10) %10;
    a[3] = (temp/100) %10;
    a[2] = (temp/1000) %10;
    a[1] = (temp/10000) %10;
    if(temp/100000 == 0)
    {
        a[0] = 0;
        if(a[1] == a[5] && a[2] == a[4])
            return 1;
    }
    else
    {
        a[0] = (temp/100000) %10;
        if(a[0] == a[5] && a[1] == a[4] && a[2] == a[3])
            return 1;
        else
            return 0;
    }
}

答案 7 :(得分:-1)

否,最大应该是:906609。 这是我的程序:

def reverse_function(x):
    return x[::-1]
def palindrome():
    largest_num = max(i * x
        for i in range(100, 1000)
        for x in range(100, 1000)
        if str(i * x) == reverse_function(str(i * x)))
    return str(largest_num)

print(palindrome())