使用C语言解决项目Euler#4

时间:2014-01-09 15:36:17

标签: c project

我尝试使用C语言解决项目Euler的问题4,但始终得到错误的答案。

// Project Euler - Problem 5 
// 09/01/2014
#include <stdio.h>

int a,b,c,digits[14],e,y,z,biggestNum;

void isPalindrome (int x)
{
    a = -1;
    c = 0;
    b = x;
    while (b != 0)
    {
        digits[c] = (b % 10);
        b=b/10;
        c++;
    }
    while (c>=a)
    {
        if(digits[++a]!=digits[--c])
        {
            break;
        }
        if(a==c) {  biggestNum=x; }
        else if(a==c-1) {   biggestNum=x; }
    }
}

int main (void)
{
    for(y=10; y<1000; y++)
    {
        for(z=10; z<1000; z++)
        {
            isPalindrome(y*z);
        }
    }
    printf ("%d",biggestNum);
    return 0;
}

有人能告诉我我的代码有什么问题吗?也许在检查num是否是Palindrome函数? 谢谢 The Problem

3 个答案:

答案 0 :(得分:1)

  1. 您可以使用以下内容改进foor循环:
  2.     for(y = 999; y >= 100 ; --y)
        {
            for(z = y; z >= 100; --z)
            {
                if (isPalindrome(y*z)) {
                    return y*z; // TODO: use temp var
                }
            }
        }
    
    1. 使用n / 2步骤(n为数字位数)将数字转换为字符串和检查会更容易
    2.     for (i = 0; i < n/2; i++)
          {
              if (str[i] != str(n-i)) {
                  return false;
              }
          }
          return true
      

答案 1 :(得分:1)

您的代码找不到最大的Palindrome,如果您查看数字,它会找到最后一个Palindrome

10* 10, 10 * 11, 10 * 12, .... 10 * 999
...
999 * 10, 999 * 11, ....       999 * 999

如果最大的回文恰好是(例如)750 * 750,而999 * 11是回文,那么999 * 11将覆盖正确答案。

每次你的答案大于之前的最大答案时,你需要进行测试。

答案 2 :(得分:0)

变化

    while (c>=a)
    {
        if(digits[++a]!=digits[--c])
        {
            break;
        }
        if(a==c) {  biggestNum=x; }
        else if(a==c-1) {   biggestNum=x; }
    }

    while (c > a){
        if(digits[++a]!=digits[--c])
            return ;
    }
    if(x>biggestNum)//bigger than old value
        biggestNum=x;