My code for solving Project Euler problem #55 is giving incorrect results. Specifically, my isLychrellNumber
function gives way too many positive results, and also gives some false-negatives.
I’ve compared my code to other solutions but I can’t find the error.
My code:
// store single digits in an array, lowest digits come first
typedef std::vector<int> Digits;
// Adds two large numbers where y >= x
Digits add(Digits x, Digits y)
{
Digits result{};
int carry{ 0 };
for (std::size_t i = 0; i < x.size(); ++i)
{
int digit{ x[i] + y[i] + carry };
if (digit > 10)
{
carry = digit / 10;
digit -= 10;
}
else
{
carry = 0;
}
result.push_back(digit);
}
if (y.size() > x.size())
{
for (std::size_t i = x.size(); i < y.size(); ++i)
{
int digit{ y[i] + carry };
if (digit > 10)
{
carry = digit / 10;
digit -= 10;
}
else
{
carry = 0;
}
result.push_back(digit);
}
}
if (carry != 0)
result.push_back(carry);
return result;
}
template <typename T>
bool isPalindrome(const std::vector<T>& v)
{
std::vector<T> reversed{ v };
std::reverse(reversed.begin(), reversed.end());
return v == reversed;
}
bool isLychrellNumber(int n)
{
Digits numDigits{ numToDigits(n) };
for (int i = 0; i < 60; ++i)
{
Digits flipped{ numDigits };
std::reverse(flipped.begin(), flipped.end());
auto sum{ add(numDigits, flipped) };
if (isPalindrome(sum))
return false;
numDigits = std::move(sum);
}
return true;
}
int main()
{
int answer{ 0 };
std::cout << std::boolalpha << isLychrellNumber(349) << 'n';
std::cout << std::boolalpha << isLychrellNumber(196) << 'n';
for (int i = 0; i < 10000; ++i)
{
if (isLychrellNumber(i))
++answer;
}
std::cout << "Answer: " << answer;
return 0;
}