Statement of problems: for a given positive number, I must find out immediately the next palindrome. For instance:
For 808, output:818
2133, output:2222
I want to know if my code is effective at all and how effective is it? Is this a good way to solve the problem?
Logical explanation: I set the inumbers to the extreme left, jto the right, and I basically compare 2 numbers. I always assign num[j]=num[i]and track if the number becomes greater than the original value or less than or equal. In the end, it is:, j-i==1 or j==idepending on the number of digits of an even or odd number, I see if the number has increased or not by making an appropriate decision.
EDIT: The number can be up to 100,000 digits! .. This was part of the problem statement, so I try to avoid brute force methods.
int LeftNineIndex = 0, RightNineIndex = 0;
bool NumberLesser = false, NumberGreater = false;
string number = Console.ReadLine();
char[] num = number.ToCharArray();
int i, j, x, y;
for (i = 0, j = num.Length - 1; i <= j; i++, j--)
{
char m;
Int32.TryParse(num[i].ToString(),out x);
Int32.TryParse(num[j].ToString(), out y);
if (x > y)
{
NumberGreater = true;
NumberLesser = false;
}
else if (x < y)
{
if (j - i == 1)
{
NumberGreater = true;
NumberLesser = false;
x = x + 1;
Char.TryParse(x.ToString(), out m);
num[i] = m;
}
else
{
NumberGreater = false;
NumberLesser = true;
}
}
if ((j == i && NumberGreater == false) || (j - i == 1 && x == y && NumberGreater == false))
{
if (x != 9)
{
x = x + 1;
Char.TryParse(x.ToString(), out m);
num[i] = m;
}
else
{
if (num.Length != 1)
{
Int32.TryParse(num[LeftNineIndex].ToString(), out x);
Int32.TryParse(num[RightNineIndex].ToString(), out y);
x = x + 1;
Char.TryParse(x.ToString(), out m);
num[LeftNineIndex] = m;
num[RightNineIndex] = m;
}
else
{
Console.WriteLine("11");
}
}
}
num[j] = num[i];
if (x != 9)
{
LeftNineIndex = i;
RightNineIndex = j;
}
}
Console.WriteLine(num);
source
share