Ştiri:

Vă rugăm să citiţi Regulamentul de utilizare a forumului Scientia în secţiunea intitulată "Regulamentul de utilizare a forumului. CITEŞTE-L!".

Main Menu

palindrom 5 cifre

Creat de Ayumi, Noiembrie 23, 2011, 09:00:44 AM

« precedentul - următorul »

0 Membri şi 1 Vizitator vizualizează acest subiect.

Ayumi

 Buna ziua !
Am scris un program care afiseaza toate numerele palindrom de 5 cifre. Problema este ca nu functioneaza.Ceva nu este in regula si nu imi dau seama de eroare,chiar daca am mai facut cateva modificari...

#include <iostream>
using namespace std;

int main()
{
int i,inv = 0,aux;
for (i = 10000;i <= 99999;i++) {
aux = i;//aux primeste valoarea lui i
while (aux > 0) {
inv = inv*10+i%10;//aici ar trebui sa fie aux%10 in loc de i%10?
i = i/10;}
if (inv == aux) cout << i << endl;}
return 0;
}

Multumesc anticipat !

zec

Cum determini inversul unui numar de 5 cifre?
Nu cumva ar trebui ca cifra zecilor de mii sa devina a unitatilor ,cifra miilor a zecilor etc.
Cifra zecilor de mii se afla usor e [i/10000].Dar cifra miilor e [i/1000]-[i/10000]x10.
Evident  parantezele patrate se refera la parte intreaga.

Ayumi

 Pai,atunci cand determin  inversul unui numar nr trebuie sa-i scot cifrele siastfel valoarea sa se va pierde. De asta trebuie sa il salvez pe nr intr-o variabila auxiliara,nu?

zec

#3
ok salvezi numarul cu un numar auxiliar si dupa aceea calculezi numarul invers  stiind numarul i dupa care compari.
aux=i;
inv=[i/10000]+([i/1000]-[i/10000]*10)*10+([i/100]-[i/1000]*10)*100+([i/10]-[i/100]*100)*1000+(i-[i/10]*10)*10000;
Alta idee nu am.Parca la parte intreaga in c++ se foloseste int().Aaa sper ca sti ca va afisa 900 de numere!!!
Edit.La programul initial mi se pare ca inv devine imens dupa numai cateva iteratii.Felul cum calculezai inv e gresit in program.

mircea_p

Citat din: Ayumi din Noiembrie 23, 2011, 09:00:44 AM
Buna ziua !
Am scris un program care afiseaza toate numerele palindrom de 5 cifre. Problema este ca nu functioneaza.Ceva nu este in regula si nu imi dau seama de eroare,chiar daca am mai facut cateva modificari...

#include <iostream>
using namespace std;

int main()
{
int i,inv = 0,aux;
for (i = 10000;i <= 99999;i++) {
aux = i;//aux primeste valoarea lui i
while (aux > 0) {
inv = inv*10+i%10;//aici ar trebui sa fie aux%10 in loc de i%10?
i = i/10;}
if (inv == aux) cout << i << endl;}
return 0;
}

Multumesc anticipat !

Mi se pare ca ciclul "while" va continua la infinit. Incepand cu aux=i=10000 si inv=0, inv va ramane zero iar aux ramane 10000 (ciclul nu ii modifica valoarea). Conditia inv==aux nu se indeplineste niciodata.


tavy

#5
Mai simplu:

#include<iostream>
int main(){
int i;
for(i=100;i<1000;i++)std::cout<<(i*100+i/10%10*10+i/100)<<std::endl;
return 0;
}

sau

#include<iostream>
int main(){
int i;
for(i=100;i<1000;i++)std::cout<<i<<i/10%10<<i/100<<std::endl;
return 0;
}


În principiu trebuie să cauți atunci când scrii un program să fie cât mai simplu, ai astfle mai puține șanse să greșești.
În plus, nu este tocmai eficient să verifici pentru fiecare număr de cinci cifre dacă este palindrom când poți să generezi direct numerele de cinci cifre care sunt palindroame.

Ayumi

 Da,va multumesc. Mi-a dat seama unde am gresit si voi tine cont de sfaturi   :)

tavy

Citat din: Ayumi din Noiembrie 23, 2011, 11:05:20 PM
Da,va multumesc. Mi-a dat seama unde am gresit si voi tine cont de sfaturi   :)
Acum, dacă ai înțeles de ce porniseși pe o cale greșită să vedem cum se rezolva totuși problema pe calea pe care porniseși:

#include <iostream>
using namespace std;

int main()
{
int i,inv,aux;
for (i = 10000;i <= 99999;i++) {
aux = i;
inv=0;
while (aux > 0) {
inv = inv*10+aux%10;
aux = aux/10;
}
if (inv == i) cout << i << endl;
}
return 0;
}

Sau într-un stil mai apropiat de C/C++

#include <iostream>
using namespace std;

int main()
{
int i,inv,aux;
for (i = 10000;i <= 99999;i++) {
for(aux=i, inv=0; aux>0; aux/=10)inv=inv*10+aux%10;
if (inv == i) cout << i << endl;
}
return 0;
}


Dar pentru a vedea totuși diferența de performanță între ultimele două variante și celelalte doua anterioare avem:
pentru prima variantă, din mesajul anterior:

[tavy@tavy ~]$ time ./palindrom >/dev/null

real    0m0.004s
user    0m0.002s
sys     0m0.002s

pentru ultima variantă din mesajul curent:

[tavy@tavy ~]$ time ./palindrom >/dev/null

real    0m0.014s
user    0m0.010s
sys     0m0.003s

Se observă diferența de timp, 4ms varianta optimizată versus 14ms varianta neoptimizată. Trebuie remarcat că din timpul acesta 2ms respectiv 3ms sunt ocupate de sistem pentru încărcare librării, scriere, etc. timpul pentru calculul propriu zis este de 2ms respectiv 10ms, deci diferența este chiar mare, programul care verifică fiecare număr durează de cinci ori mai mult.
În cazul acesta nu este o problemă timpul pentru că oricum pentru noi pare instantaneu dar gândește-te că ai un program care optimizat durează 10s, cum ar fi să dureze 50s?

tavy

Citat din: zec din Noiembrie 23, 2011, 01:09:17 PM
Parca la parte intreaga in c++ se foloseste int().
În C++ dacă operanzii lui "/" sunt de tip int atunci împărțirea se face în numere întregi iar rezultatul va fi de tip int, respectiv câtul împărțirii. Pentru restul împărțirii avem operatorul % care va face operația modulo.
Poți folosi ,,int(expresie)" pentru a face o conversie a rezultatului expresiei la tipul int, valabil doar la C++, la C va trebui să folosești operatorul cast de genul ,,(int)expresie".