2

我正在尝试用 c# 解决项目 euler #4,根据以前的帖子,我找不到任何用 c# 解决此问题的方法。

问题是:

回文数的两种读法都是一样的。由两个 2 位数字的乘积构成的最大回文数是 9009 = 91 99。

找出由两个 3 位数字的乘积构成的最大回文数。

下面是我的代码,但是当我查看它的流程时,我看不到我的错误。我该如何解决?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CS_11_project_Euler_problem_4
{

class Program
{

    static void Main(string[] args)
    {
        int x, y;
        string product="" , res="";

        for (x = 100; x <= 999; x++)
        {
            for (y = 100; y <= 999; y++)
            {
                product = Convert.ToString(x*y);

                if (product == new String(product.Reverse().ToArray()))
                {
                    Console.WriteLine("X=" + x + " Y=" + y );
                    res = product;

                    Console.WriteLine("Polindrome is: " + res);
                }

                else { continue; }
            }
        }
    }
}
}

我的代码找到的结果是 580085,这是我的输出截图。它显示每个结果回文数及其乘数。

在此处输入图像描述

Eventough 根据 projecteuler.net 我的结果不正确。我的输出之一是给我实际的结果。906609 。这是我的代码最后一个回文之前的第二个结果。我认为在嵌套的 for 循环中增加乘数是错误的,因为它无意中基于“最大的 X 给出最大的乘数逻辑”。为了防止它,我将再次将我的 res 和 product 转换为整数,并始终将更大的 product 结果保留为变量 product

4

2 回答 2

2

因为一旦你找到了一个回文,你就会在你的 while 循环中永远循环。将时间更改为和如果它应该工作。

编辑:

是的,您需要跟踪迄今为止发现的最大产品,而不是简单地假设最后发现的产品是最大的。

于 2013-05-26T19:05:26.603 回答
1

我遇到了同样的错误,当我找到这篇文章时我正在寻求帮助。你的控制台截图帮助我解决了这个问题。

如您所见,官方答案会在您的最终答案之前打印出来。请注意,该问题要求您提供“最大”回文,它恰好是 906609 而不是 580085。我们的程序打印后者,因为它根据 for 循环进行,回文检查适用的最后一个 x 是打印的值。

我通过一个 if 条件解决了这个问题(我的代码逻辑不同,但我已经适应了你的):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CS_11_project_Euler_problem_4
{

class Program
{

    static void Main(string[] args)
    {
        int x, y;
        string product="" , res="";

        for (x = 100; x <= 999; x++)
        {
            for (y = 100; y <= 999; y++)
            {
                product = Convert.ToString(x*y);

                if (product == new String(product.Reverse().ToArray()))
                {
                    Console.WriteLine("X=" + x + " Y=" + y );

                    if(x*y>Convert.ToInt64(res))
                        res = product;
                        Console.WriteLine("Polindrome is: " + res);
                }

                else { continue; }
            }
        }
    }
}
}

if 块检查此产品是否大于前一个产品,如果是,则打印。希望这可以帮助!

PS:我有一个非常复杂的逻辑,涉及列表和检查每个数字和东西。您的字符串逻辑看起来非常优雅!谢谢!

于 2015-10-27T16:28:28.973 回答