Forumul Scientia

IT şi electronică => Programare => Subiect creat de: Ayumi din Noiembrie 23, 2011, 09:00:44 AM

Titlu: palindrom 5 cifre
Scris de: 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 !
Titlu: Răspuns: palindrom 5 cifre
Scris de: zec din Noiembrie 23, 2011, 09:31:24 AM
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.
Titlu: Răspuns: palindrom 5 cifre
Scris de: Ayumi din Noiembrie 23, 2011, 09:38:44 AM
 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?
Titlu: Răspuns: palindrom 5 cifre
Scris de: zec din Noiembrie 23, 2011, 01:09:17 PM
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.
Titlu: Răspuns: palindrom 5 cifre
Scris de: mircea_p din Noiembrie 23, 2011, 05:08:49 PM
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.

Titlu: Răspuns: palindrom 5 cifre
Scris de: tavy din Noiembrie 23, 2011, 06:29:35 PM
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.
Titlu: Răspuns: palindrom 5 cifre
Scris de: 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   :)
Titlu: Răspuns: palindrom 5 cifre
Scris de: tavy din Noiembrie 23, 2011, 11:30:31 PM
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?
Titlu: Răspuns: palindrom 5 cifre
Scris de: tavy din Noiembrie 23, 2011, 11:41:01 PM
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".