Dichiarazione di problema: per un dato numero positivo, devo scoprire il palindromo immediatamente successivo. Ad esempio:Il mio codice è efficiente per scoprire il prossimo palindromo dato un numero intero positivo?
For 808, output:818
2133, output:2222
Voglio sapere se il mio codice è efficiente e quanto è efficiente? È un buon modo per risolvere il problema?
Spiegazione logica: ho impostato i
nella posizione più a sinistra del numero, j
nella posizione più a destra e sto praticamente confrontando i 2 numeri. Assegno sempre num[j]=num[i]
e tengo traccia se il numero diventa maggiore del valore originale, o inferiore o uguale. Alla fine, ovvero: j-i==1 or j==i
, a seconda del numero di cifre pari o dispari del numero, vedo se il numero è diventato maggiore o meno, prendendo una decisione di conseguenza.
MODIFICA: il numero può essere lungo fino a 100.000 cifre! .. Questo faceva parte della dichiarazione del problema, quindi sto cercando di evitare i metodi di forza bruta.
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) // if the number is 9, then i can't add 1 to it
{
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
{
// user has entered just '9', in which case I've hard-coded
Console.WriteLine("11");
}
}
}
num[j] = num[i];
if (x != 9) //gives us the index of the number closest to the middle, which is not 9
{
LeftNineIndex = i;
RightNineIndex = j;
}
}
Console.WriteLine(num);
Quindi questa è una domanda sui compiti? – RQDQ
No ... solo un rompicapo di programmazione che ho letto su qualche sito web –
Tutti i palindromi con un numero pari di cifre sono divisibili per 11. Fatto netto ed eventualmente collegamento utile. Ad esempio 2222/11 = 202 – BeRecursive