Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - miglioramento per programma numeri palindromi
Forum - C/C++ - miglioramento per programma numeri palindromi

Avatar
ElCobra91 (Normal User)
Newbie


Messaggi: 18
Iscritto: 22/08/2010

Segnala al moderatore
Postato alle 23:00
Lunedì, 06/09/2010
ciao a tutti,sto studiando il c++ su un libro che mi chiede in un esercizio di fare un programma che prende in input un numero di cinque cifre e verifica se esso sia palindromo. Io ho scritto il mio programmino che funziona però vorrei chiedere a voi che siete più esperti se sia possibile scriverne uno più corto senza usare for,and,or, solo con if..else e while.
Se si potete dirmi come abbreviare il mio codice?grazie a tutti...



Codice sorgente - presumibilmente C#

  1. //programma che verifica se un numero di 5 cifre inserito è palindromo
  2. #include<iostream>
  3. using namespace std;
  4.  
  5. int main()
  6.  
  7. {
  8.         system("color f0");
  9.         int n; //variabile per il numero da inserire
  10.         int r;//serve a memorizzare il resto
  11.         int a;//serve a memorizzare l'ultima cifra del numero inserito
  12.         int b;//serve a memorizzare  la seconda cifra del numero inserito
  13.         int c;//serve a memorizzare la quarta cifra del numero inserito
  14.         int counter=1;
  15.  
  16.         cout<<"Inserisci un numero di 5 cifre per stabilire se è un palindromo:\n";
  17.         cin>>n;
  18.         cout<<endl;
  19.         cout<<"Ecco il numero scritto al contrario:\n";
  20.        
  21.  
  22.  
  23.         while(counter<=5)//cicla 5 volte in quanto effettuo la verifica su un numero di 5 cifre
  24.         {
  25.                
  26.  
  27.                
  28.                 r = n%10;//resto che al termine del ciclo rappresenta la prima cifra del numero scritto
  29.                 n/= 10;
  30.         if(counter==1)
  31.                         a=r;//memorizza l'ultima cifra del numero inserito
  32.                 if(counter==2)
  33.                         b=r;//memorizza la seconda cifra del numero inserito
  34.                 if (counter==4)
  35.                         c=r;//memorizza la quarta cifra del numero inserito
  36.                 cout<<r ;  //visualizza il numero al contrario  
  37.             counter++;
  38.     }
  39.         cout<<endl;
  40.         if(r==a){//verifica se il numero è palindromo
  41.                 if(c==b)
  42.                         cout<<"Il numero è palindromo"<<endl;
  43.         }
  44.                 else
  45.                         cout<<"Il numero NON è palindromo"<<endl;
  46.         cout<<endl;
  47.        
  48.         system("pause");
  49.                 return 0;
  50. }


PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
3
Down
V
Segnala al moderatore
Postato alle 9:55
Martedì, 07/09/2010
Il metodo che segue funziona con numeri di tutte le dimensioni. Devi includere le librerie di matematica (le funzioni le ho riprese da math.h, non so che libreria ci sia in c++).
Codice sorgente - presumibilmente C++

  1. int a, b, n, dec;
  2. bool palindromo;
  3. //...
  4. palindromo = true;
  5. do
  6. {
  7.    dec = (int)floor(log10(n));
  8.    a = (int)floor(n / pow(10, dec));
  9.    b = n % 10;
  10.    n -= a * (int)pow(10, dec);
  11.    n /= 10;
  12.    if (a != b)
  13.       palindromo = false;
  14. } while (n > 0 && palindromo);


PM
Avatar
gigisoft (Member)
Guru


Messaggi: 696
Iscritto: 11/10/2008

Up
2
Down
V
Segnala al moderatore
Postato alle 11:07
Martedì, 07/09/2010
Salve,
se devi limitarti al caso di numeri di 5 cifre puoi semplicemente verificare che:

- (n >= 10000) &&
- (n <= 99999) &&
- ((ceil(n / 10000)) == (n % 10)) &&
- (((ceil(n / 1000)) % 10) == (ceil((n % 100) / 10)))

le prime due verificano che il numero sia effettivamente di 5 cifre
la seconda verifica che siano uguali la prima e l'ultima cifra
la terza verifica che siano uguali la seconda e la quarta cifra.

Se invece vuoi generalizzare al caso di k cifre devi verificare che:

- (n >= 10^(k - 1)) &&
- (n < 10^k)

e poi verificare ciclicamente che:

(((ceil(n / 10^(k - i))) % 10) == (ceil((n % (10^i)) / (10^(i - 1)))));

con i: 1..ceil(k/2)

naturalmente per semplicita' ho indicato col ^ l'elevazione a potenza.

:ot:e poi c'e' ancora chi pensa che la matematica sia separata dall'informatica... :-| :ot:

naturalmente risulta tutto piu' semplice se prima converti il numero in stringa, ma usi piu' memoria; a te la scelta.
Ciao.


PM
Avatar
ElCobra91 (Normal User)
Newbie


Messaggi: 18
Iscritto: 22/08/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 16:05
Martedì, 07/09/2010
grazie a tutti,mi avete aiutato molto,terrò a mente tutti i consigli però lascio il programma in quel modo perchè devo farlo senza utilizzare i connettivi logici o il do...while in quanto il libro che studio è diviso in capitoli e a quelli non ci sono ancora arrivato,cmq grazie mille...:k:

PM
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 21:23
Martedì, 07/09/2010
Testo quotato

Postato originariamente da ElCobra91:

scusa ma sono poco esperto,se lo memorizzassi su stringa poi come potrei cambiare il programma?grazie



In realtà è molto semplice: basta confrontare i caratteri, in questo modo:

Codice sorgente - presumibilmente C++

  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <string.h>
  4.  
  5. using namespace std;
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9.     char numero[6]="";
  10.     cout<<"Verifica sui numeri palindromi\n\nNumero: ";
  11.     cin.getline(numero, 6);
  12.     int i=0;
  13.     bool palindromo=true;
  14.     while (i<strlen(numero)/2)
  15.     {
  16.         if (numero[i] != numero[strlen(numero)-1-i])
  17.         {
  18.             palindromo=false; // il numero non è palindromo
  19.             break;
  20.         }
  21.         i++;  
  22.     }
  23.     if (palindromo) cout<<"\nIl numero e' palindromo\n";
  24.     else cout<<"\nIl numero non e' palindromo\n";
  25.     cin.ignore();
  26.     return 0;
  27. }


PM
Avatar
ElCobra91 (Normal User)
Newbie


Messaggi: 18
Iscritto: 22/08/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 3:54
Martedì, 07/09/2010
scusa ma sono poco esperto,se lo memorizzassi su stringa poi come potrei cambiare il programma?grazie

PM
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Up
-1
Down
V
Segnala al moderatore
Postato alle 23:57
Lunedì, 06/09/2010
Ciao!

Ho letto il tuo programma, e posso consigliarti di memorizzareil numero su stringa anzichè  un int.

Ultima modifica effettuata da Poggi Marco il 07/09/2010 alle 0:00
PM