ElCobra91 (Normal User)
Newbie
Messaggi: 18
Iscritto: 22/08/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# |
//programma che verifica se un numero di 5 cifre inserito è palindromo #include<iostream> using namespace std; int main() { system("color f0"); int n; //variabile per il numero da inserire int r;//serve a memorizzare il resto int a;//serve a memorizzare l'ultima cifra del numero inserito int b;//serve a memorizzare la seconda cifra del numero inserito int c;//serve a memorizzare la quarta cifra del numero inserito int counter=1; cout<<"Inserisci un numero di 5 cifre per stabilire se è un palindromo:\n"; cin>>n; cout<<endl; cout<<"Ecco il numero scritto al contrario:\n"; while(counter<=5)//cicla 5 volte in quanto effettuo la verifica su un numero di 5 cifre { r = n%10;//resto che al termine del ciclo rappresenta la prima cifra del numero scritto n/= 10; if(counter==1) a=r;//memorizza l'ultima cifra del numero inserito if(counter==2) b=r;//memorizza la seconda cifra del numero inserito if (counter==4) c=r;//memorizza la quarta cifra del numero inserito cout<<r ; //visualizza il numero al contrario counter++; } cout<<endl; if(r==a){//verifica se il numero è palindromo if(c==b) cout<<"Il numero è palindromo"<<endl; } else cout<<"Il numero NON è palindromo"<<endl; cout<<endl; system("pause"); return 0; }
|
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
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++ |
int a, b, n, dec; bool palindromo; //... palindromo = true; do { dec = (int)floor(log10(n)); a = (int)floor(n / pow(10, dec)); b = n % 10; n -= a * (int)pow(10, dec); n /= 10; if (a != b) palindromo = false; } while (n > 0 && palindromo);
|
|
|
gigisoft (Member)
Guru
Messaggi: 696
Iscritto: 11/10/2008
|
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.
e poi c'e' ancora chi pensa che la matematica sia separata dall'informatica...
naturalmente risulta tutto piu' semplice se prima converti il numero in stringa, ma usi piu' memoria; a te la scelta.
Ciao.
|
|
ElCobra91 (Normal User)
Newbie
Messaggi: 18
Iscritto: 22/08/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...
|
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/2010
|
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++ |
#include <cstdlib> #include <iostream> #include <string.h> using namespace std; int main(int argc, char *argv[]) { char numero[6]=""; cout<<"Verifica sui numeri palindromi\n\nNumero: "; cin.getline(numero, 6); int i=0; bool palindromo=true; while (i<strlen(numero)/2) { if (numero[i] != numero[strlen(numero)-1-i]) { palindromo=false; // il numero non è palindromo break; } i++; } if (palindromo) cout<<"\nIl numero e' palindromo\n"; else cout<<"\nIl numero non e' palindromo\n"; cin.ignore(); return 0; }
|
|
|
ElCobra91 (Normal User)
Newbie
Messaggi: 18
Iscritto: 22/08/2010
|
scusa ma sono poco esperto,se lo memorizzassi su stringa poi come potrei cambiare il programma?grazie
|
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/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 |
|