Răspuns :
Aaaa....banuiesc ca nu esti expert in arta programatului (no offense).
Desi e lung am detectat doar doua greseli:
1) Problema nu-ti spune ca n are doar 2 cifre. Poate sa aiba si 200 de cifre. Cand folosesti smecheria cu modul de 10 tu iei ultimele 2 cifre
Aici: "cu=n%10;
n=n/10;
cz=n%10;
n=n/10;"
Daca n=12345 atunci n%10 =5. Deci iei ultimele cifre. La aceasta problema poti folosii doua functii:
int len_of_nr(int nr){
// Ia numarul de cifre din nr.
int count=0;
do{
count++;
nr/=10;
}while(nr!=0);
return count;
}
si
#include <cmath>
int get_char(int nr,int char_count,int pos){
// Ia cifra la o anumita pozitie din nr
// (1 e la coada pana la inceput-> pos:n..321)
int div=1;
for(div=1;div<pow(10,pos-1);div*=10);
return (nr/div)%10;
}
2) Nu inteleg de ce ai facut asta aici:
"do
{
x=x/10;
nr++;
printf("%d ",nr);
break;
}
while(x!=0);" _Tradus :scoate din x ultima cifra; aduna 1 la nr; afiseaza nr; opreste loop-ul; si atat. Adica daca initial nr era 0 acum va afisa 1 si se va operii..de ce? tinand cont de faptul ca mai jos ai facut cum trebuie:
"do
{
cif=x%10;
if(cif%2==0)
cp++;
x=x/10;
}while(x!=0);
printf("%d ",cp);
return 0;
}" ->aici e perfect...
*3) -o mica optimizare/neintelegere?
Aici:
"if(nou%d==0)
s=s+d;
if(x==s)
{" -De ce ai facut asa? Da..aici verificai cum trebuie daca "nou" e patrat perfect insa ce e cu s+=d ? Adica daca toti divizorii (speciali) a lui "nou" adunati fac cat x atunci...? Asta e cam gresit.
Puteai face asa:
for(d=1; d*d<=nou; d++)
if(nou%d==0){
isPerfect=true;
break;
}
if(isPerfect)
do....
else
.....
Desi e lung am detectat doar doua greseli:
1) Problema nu-ti spune ca n are doar 2 cifre. Poate sa aiba si 200 de cifre. Cand folosesti smecheria cu modul de 10 tu iei ultimele 2 cifre
Aici: "cu=n%10;
n=n/10;
cz=n%10;
n=n/10;"
Daca n=12345 atunci n%10 =5. Deci iei ultimele cifre. La aceasta problema poti folosii doua functii:
int len_of_nr(int nr){
// Ia numarul de cifre din nr.
int count=0;
do{
count++;
nr/=10;
}while(nr!=0);
return count;
}
si
#include <cmath>
int get_char(int nr,int char_count,int pos){
// Ia cifra la o anumita pozitie din nr
// (1 e la coada pana la inceput-> pos:n..321)
int div=1;
for(div=1;div<pow(10,pos-1);div*=10);
return (nr/div)%10;
}
2) Nu inteleg de ce ai facut asta aici:
"do
{
x=x/10;
nr++;
printf("%d ",nr);
break;
}
while(x!=0);" _Tradus :scoate din x ultima cifra; aduna 1 la nr; afiseaza nr; opreste loop-ul; si atat. Adica daca initial nr era 0 acum va afisa 1 si se va operii..de ce? tinand cont de faptul ca mai jos ai facut cum trebuie:
"do
{
cif=x%10;
if(cif%2==0)
cp++;
x=x/10;
}while(x!=0);
printf("%d ",cp);
return 0;
}" ->aici e perfect...
*3) -o mica optimizare/neintelegere?
Aici:
"if(nou%d==0)
s=s+d;
if(x==s)
{" -De ce ai facut asa? Da..aici verificai cum trebuie daca "nou" e patrat perfect insa ce e cu s+=d ? Adica daca toti divizorii (speciali) a lui "nou" adunati fac cat x atunci...? Asta e cam gresit.
Puteai face asa:
for(d=1; d*d<=nou; d++)
if(nou%d==0){
isPerfect=true;
break;
}
if(isPerfect)
do....
else
.....