Для этой проблемы, так как мы ищем самый высокий палиндром, я предположил, что он будет начинаться с 9, таким образом, заканчивая 9 (палиндром).
если вы обратите внимание, чтобы получить число, заканчивающееся на 9, вы можете получить его только с номерами, заканчивающимися на 9 и 1, 3 и 3, 7 и 7.
Тогда бесполезно проверять другие значения (например, 999 * 998, поскольку они не заканчиваются на 9).
Начиная с 999 и 991, вы можете затем вычесть 10 из 991, попробовав 999 и 981 и т. Д.
Вы делаете то же самое с 993 и 993 ... 993 * 983
то же самое с 997 * 997, затем 997 * 987 и т. д.
Вам не нужно идти дальше, чем 900 или 10 ^ 4 - 10 ^ 3, так как вы можете быть уверены, что самый высокий будет раньше.
int PB4_firstTry(int size)
{
int nb1 = (int)pow(10.0,size+1.0) - 1, nb2 = (int)pow(10.0,size+1.0) - 1;
int pal91 = getFirstPalindrome(size,9,1);
int pal33 = getFirstPalindrome(size,3,3);
int pal77 = getFirstPalindrome(size,7,7);
int bigger1 = (pal91 > pal33) ? pal91 : pal33;
return (bigger1 > pal77) ? bigger1 : pal77;
}
int getFirstPalindrome(int size,int ending1,int ending2)
{
int st1 = (int)pow(10.0,size+1.0) - 10 + ending1;
int comp = st1 - pow(10.0,size);
int st2 = (int)pow(10.0,size+1.0) - 10 + ending2;
int answer = -1;
while (st1 > comp)
{
for (int i = st2; i > comp && st1*i > answer; i-=10)
{
if (PB4_isPalindrome(st1*i))
answer = st1*i;
}
st1 -= 10;
}
return answer;
}
bool PB4_isPalindrome(int number)
{
std::string str = intToString(number);
for (int i = 0; i < (int)(str.length() / 2); i++)
{
if (str[i] != str[str.length() - 1 - i])
return false;
}
return true;
}
std::string intToString(int number)
{
std::ostringstream convert;
convert << number;
return convert.str();
}
Конечно, это работает для 4-значных чисел и т. Д.