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:

Cod: Selectaţi tot

$nr = array_sum(str_split(strval($nr)));
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

Cod: Selectaţi tot

conditie ? A : B;
este echivalenta cu:

Cod: Selectaţi tot

if(conditie) { avem A; }
else { avem B; }

Subiecte similare