我的代码编译但好像它可能永远找不到答案。这很奇怪,因为我看过的代码几乎完全相同,只需几秒钟即可完成。
这是我的代码:
#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;
}
答案 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= i
到j>=100
并在i*j<= biggestProduct
或i*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
编辑块可能是另一种选择。