用C语言求解Euler#4工程

用C语言求解Euler#4工程,c,project,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] = (

我试图用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;
}
//欧拉计划-问题5
// 09/01/2014
#包括
int a,b,c,数字[14],e,y,z,biggestNum;
无效isPalindrome(int x)
{
a=-1;
c=0;
b=x;
而(b!=0)
{
数字[c]=(b%10);
b=b/10;
C++;
}
而(c>=a)
{
如果(数字[++a]!=数字[--c])
{
打破
}
如果(a==c){biggestNum=x;}
如果(a==c-1){biggestNum=x;}
}
}
内部主(空)
{
对于(y=10;y
  • 您可以通过以下方法改进foor循环:
  • 对于(y=999;y>=100;--y) { 对于(z=y;z>=100;--z) { if(isPalindrome(y*z)){ 返回y*z;//TODO:使用临时变量 } } }
  • 将数字转换为字符串和使用n/2步骤(n为位数)进行检查会更容易
  • 对于(i=0;i


    您的代码没有找到最大的回文,如果您遍历这些数字,它会找到最后一个回文

    10* 10, 10 * 11, 10 * 12, .... 10 * 999
    ...
    999 * 10, 999 * 11, ....       999 * 999
    
    如果最大的回文恰好是(比如)750*750,但999*11也是回文,那么999*11将覆盖正确答案


    每次你都需要测试你的答案是否比上一个最大的答案大。

    如果你在帖子中提供问题的链接,这将非常有帮助。好吧,如果你的isPalindrome函数占源代码的90%,剩下的10%是主线,那么问题很可能在isPalin中drome函数。您可能需要查看并进行一些调试。它是否正确检测回文?它是否正确拒绝非回文的数字?您的代码打印什么?它打印两个3位数字乘积的最大回文数是的,
    isPalindrome
    函数有问题。函数named
    is
    应该返回一个布尔值,不做任何其他事情。这是一个固定的法则。你的函数返回
    void
    。因此,不管它做什么,这个函数都是不可接受的。为什么不从999开始到100,毕竟我们想要最大的回文,用这种方法得到的第一个回文就是答案。你是r是的,我的答案是错误的,因为没有计算
    999*999
    ,我会更新。非常感谢。这就是我修复代码后的问题,它输出的数字是906609,这是正确的答案。 for (i = 0; i < n/2; i++) { if (str[i] != str(n-i)) { return false; } } return true
        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;
    
    10* 10, 10 * 11, 10 * 12, .... 10 * 999
    ...
    999 * 10, 999 * 11, ....       999 * 999