PDA

Visualizza la versione completa : [C] Determinare se un numero è palindromo


XWolverineX
13-05-2007, 21:05
Per chi non lo sapesse, un numero è palindromo se leggendono da ambo i sensi, il numero resta uguale.
Alcuni esempi sono
55555 12321 4554

Come capire se, digitando un numero, questo è palindromo?
Si potrebbe fare cosi


bool Palindromo(int numero = 111)
{
char *c = new char[5];
itoa(numero,c,0);
return !strcmp(c,strrev(c));
}

O comunque, una cosa del genere (il codice può essere errato, non ricordo bene gli argomenti di itoa.
Però su un libro propone di capire ciò usando solo le strutture di controllo e le 4 operazioni, facendo particolare riferimento a % e /.
Io ci ho riflettuto ma non sono arrivato a una soluzione.
Voi come fareste?

oregon
13-05-2007, 21:50
Così ...



int a = 12321;

char cifra[30];
int nd=-1;
while(cifra[++nd] = (a % 10)) a /= 10;

int pali=1;
for(int c=0; c<nd/2; c++)
if(cifra[c] != cifra[nd-c-1])
pali=0;

if(pali) printf("Palindromo\n");
else printf("NON Palindromo\n");

XWolverineX
14-05-2007, 08:43
Gli array non sono stati ancora introdotti!

Il Pazzo
14-05-2007, 10:53
e boh guarda... mi pare di aver capito che deve essere senza vettori....

a parte che sono un casinista assoluto... l'ho fatto però boh.. ho toccato qualcosa e non mi va più.... ma nulla di particolare... il calcolo di p.. sballa dalla 3za cifra in poi credo...


#include<iostream>
#include<cmath>

using namespace std;

int Palindromo(int numero){
int j = numero;
int i = 0;
int p = 0, u = 0; // Prima e Ultima cifra del numero
double k;

while(j!=0){ //calcolo la lunghezza del numero
j/=10;
i++;
}

for(j = i - 1, k = 0; j > i/2; j--, k++){
p = (numero / pow(10,(double)j )) - (p * pow(10, k));
cout<<p<<endl;
u = (numero % (int)pow(10, k + 1)) / pow(10, k);
cout<<u<<endl;
if(p != u) return 0;
}
return 1;}

void main(){
int c = Palindromo(12321);
if(c) cout<<"palindromo";
else cout<< "Non palindromo";
}


Quando rientro vedo di finirlo...

bigmickey
16-05-2007, 10:09
Propongo un alternativa, un pò più lunga , ma forse più semplice da capire.



#include<iostream>

using namespace std;


int calcola_cifre ( int num );
int estrai_cifra ( int num, int i);
int confronto_cifre( int num , int cifre );


int main()
{
int num=0;
int cifre=0;
int ris=0;

cout<<"Inserisci numero: ";
cin>>num;

cifre = calcola_cifre(num);

ris = confronto_cifre(num,cifre);

if(ris==0) cout<<"\nPalindromo\n\n";
else cout<< "\nNon palindromo\n\n";

system("pause");
return 0;
}


int calcola_cifre ( int num )
{
int cifre=0;

while(num!=0){
num/=10;
cifre++;
}

return cifre;
}


int confronto_cifre( int num , int cifre)
{
int i;

for (i=1 ; i<=cifre/2 ; i++) {
if ( estrai_cifra(num,i) != estrai_cifra(num,cifre+1-i) )
return 1;
}

return 0;
}


int estrai_cifra ( int num, int n)
{
int j;

for ( j=1 ; j<n ; j++)
num/=10;

return num%10;
}

XWolverineX
16-05-2007, 14:59
L'algoritmo è chiaro ma non capisco il principio che usi!!

oregon
16-05-2007, 15:05
Ma se l'algoritmo e' chiaro, come fai a non avere chiaro il principio?

1) calcola il numero di cifre del numero (12321 ha 5 cifre)

2) per le prime n/2 cifre (per 12321 per le prime 2 cifre)

3) confronta la cifra 1 con la cifra 5+1-1, la prima con l'ultima

4) confornta la cifra 2 con la cifra 5+1-2, la seconda con la penultima

5) se tutte le cifre cosi' confrontate sono uguali allora e' palindromo

Esattamente come per il mio algoritmo ma senza memorizzare le cifre nell'array.

XWolverineX
16-05-2007, 16:16
Intendevo dire che sono chiare le operazioni che fa, ma non ne capivo il funzionamento.

oregon
16-05-2007, 16:26
Originariamente inviato da XWolverineX ma non ne capivo il funzionamento.

Cosa, particolare, non capisci? :confused:

Stefano1984Mn
16-05-2007, 17:56
Scusa ma se scrivi il numero iniziale in un altra variabile ma lo riporti al contrario e poi guardi se i due numeri sono uguali non è piu facile?

Loading