Cifra de control a unui numar natural in PHP
Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
-
tycyssg
- Mesaje: 58
Cifra de control a unui numar natural in PHP
Salut Marplo
Incerc sa fac exercitiul acesta:
Sa se scrie un program care să determine cifra de control a unui numar natural n dat.
Cifra de control a unui numar se obtine prin insumarea succesiva a cifrelor sale, pana cand se obtine o singura cifra.
Dar m-am cam impotmolit.
Cod: Selectaţi tot
<?php
$nr = 451235;
$sp = str_split($nr);
$sum = array_sum($sp); { //aici obtin suma numerelor
if($sum > 9) // aici verific daca suma are mai mult de 2 cifre,dupa care am incercat cu
$x = str_split($sum); // sa il pun intr-un array din nou dupa care sa le adun iar cu functia de array_sum , dar se pare ca nu merge,probabil ca ma gandesc la o solutie gresita a problemei.
$y = array_sum($x); // si secventa asta ar trebui sa se repete pana la else
}
else
{
}
?>
Daca se poate un indiciu ca apoi sa ma chinui eu sa-l fac,asta daca e varianta buna,am gasit ceva pe net dar era in c++ si era un algoritm ce impartea la 9 etc. nu prea l-am inteles
MarPlo
Mesaje: 4343
Salut
Ok, daca vrei un indicu, iata-l:
Cand ai aceleasi operatii repetitive pe o variabila, incearca sa construiesti codul pe baza unei functii recursive (care se auto apeleaza).
Vezi pe site, la cursul php despre functii recursive, lectia:
Utilizarea functiilor.
tycyssg
Mesaje: 58
Mersi ! De cateva ore imi bat capul dar nu prea stiu cum sa creez functia.
M-am uitat peste exemplul de pe site de la functii recursive, dar nu prea imi dau seama cum sa adaptez.
daca am
Cod: Selectaţi tot
function test ($x)
{
return str_split($x) // imi mai trebuie si un if pe aici ca sa se repete,care ar trebui sa comparevaloarea sirului ce trebuie convertit array
}
Si mai jos am
Cod: Selectaţi tot
$sum = array_sum($mat) // $mat fiind matricea convertita din numar
pun un if sa verifice daca este mai mare ca 10
Cod: Selectaţi tot
if($sum>10){
$reap = test($x[$mat]); //am incercat sa apelez $x cu valoarea lui $mat..dar nu a mers.
}
nu inteleg eu foarte bine functiile , dar din ce vad ele trebuie sa aibe o valoare ca sa le poti apela,iar eu nu am gasit cum sa-i dau valoare functie pt a returna formula din ea, printr-o variabila ce isi are valoarea dintr-o alta operatie.
MarPlo
Mesaje: 4343
Treptat, din incercari, tutoriale si cod pe care-l scrii, vei intelege.
Uite solutia la acest exercitiu (posibil sa fie si alte variante, mai bune, dar asta-i nivelu la cat stiu):
Cod: Selectaţi tot
function getDigitControl($nr) {
// converts the $nr to string, get array with each digit, get the digits sum
// if $nr not lower than 10, auto-call this function with the last $nr
$nr = array_sum(str_split(strval($nr)));
return ($nr < 10) ? $nr : getDigitControl($nr);
}
$nr = 4512357;
echo getDigitControl($nr); // 9
tycyssg
Mesaje: 58
Da, in ce hal se pot combina toate functiile astea de matrici , deci:
Care este rolul lui strval() aici, daca array-ul returneaza oricum o valoare numerica, sau array_sum() , returneaza o alta valoare decat numerica? Pentru ca in incercarile mele esuate primeam niste erori cum ca nu poate converti in array pt ca nu e string?
Ps: Poti explica te rog linia asta de cod:
Cod: Selectaţi tot
return ($nr < 10) ? $nr : getDigitControl($nr);
Ms.
MarPlo
Mesaje: 4343
Rolul lui strval() e sa trasforme in sir (123 in "123") fiindca str_split() se aplica pe valloare tip sir.
Prescurtarea
este echivalenta cu: