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 !
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.
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?
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.
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.
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.
Da,va multumesc. Mi-a dat seama unde am gresit si voi tine cont de sfaturi :)
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?
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".