从N个数字的两个数字的乘积中找到Palindromes

时间:2011-08-17 20:00:42

标签: c++ string algorithm

我的代码编译但好像它可能永远找不到答案。这很奇怪,因为我看过的代码几乎完全相同,只需几秒钟即可完成。

这是我的代码:

#include <iostream>

#include <sstream>

int main()
{
       for(int i = 999; i >=100; i--)
       {
              for(int j=999; j>=100;j--)
              {
                     int num = (i*j);
                     std::string number;
                     std::string temp;
                     std::string reversed;
                     std::stringstream out;
                     out << num;
                     number = out.str();
                     temp = number;
                     std::reverse(temp.begin(),temp.end());
                     if( temp == number)
                     {
                           std::cout << number << std::endl;
                     }

              }
       }



       std::cin.get();
       return 0;
}

现在这里的代码我知道工作和工作速度非常快。我不知道我们在做什么不同。

#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main()
{
    // Count down from largest to smallest, so first palindrome found is the largest

    unsigned biggestProduct = 0;

    for(unsigned n1=999; n1>=100; --n1) {
        for(unsigned n2=999; n2>=100; --n2) {
            unsigned thisProduct = n1 * n2;

            if(thisProduct > biggestProduct) {
                stringstream strmProduct;
                string strProductReverse;

                strmProduct << n1 * n2;

                strProductReverse = strmProduct.str();
                reverse(strProductReverse.begin(), strProductReverse.end());

                if(strmProduct.str() == strProductReverse)
                    biggestProduct = thisProduct;
            }
        }
    }

    cout << biggestProduct << endl;
    cin.get();

    return 0;

}

5 个答案:

答案 0 :(得分:4)

for(int i = 999; i <=100; i--)

这会不会运行(j相同)? :)

for(int i = 999; i >=100; i--)

答案 1 :(得分:3)

最大的区别是这一行if(thisProduct > biggestProduct)。如果产品小于当前最大产品,则无需检查是否为回文。

答案 2 :(得分:1)

好的,假设对for循环进行了修正,两段代码之间存在重要差异。第二个更快的代码只试图找到最大的回文,因此它避免了很多工作。你的代码试图找到所有的回文,这显然是一个更难的问题,并且需要更多的时间。

答案 3 :(得分:1)

两者之间的区别在于,第一次测试每个i*j的回文率,而另一次仅测试i*j大于已发现的最大回文。

j= ij>=100并在i*j<= biggestProducti*i<= biggestProduct时收听时,可以稍快一些。

答案 4 :(得分:0)

以下是我可以指出的几个问题:

  • 这行代码:for(int j=999; j>=100;j--)可以缩减为for(int j=999; j>=i-1;j--)。这是为了避免两次运行数字。 例如:对于i=999,您将通过j计数器,从999开始,然后是998,997等。如果从i=<998开始跳过低于或等于998的所有内容,将节省时间并且j=999会进行这些组合
  • 第二个提示是问题:你正在寻找最大的,这意味着第一个回文是最大的。因此,您需要过滤除此之外的任何组合。您可以在第二个代码中添加if(thisProduct > biggestProduct)
  • 计数器的步骤也很重要。从this discussion我发现将步长更改为2可能很有用。

  • 最后但并非最不重要的是字符串。我还了解到here,制作字符串的计算成本也很高。使用std::string编辑块可能是另一种选择。