Rezolvare completă PbInfo #2099 UnuPatru

Fiind dat un număr natural, efectuând suma pătratelor cifrelor numărului dat, apoi repetând însumarea pătratelor cifrelor pentru numerele obţinute ca rezultat, la un moment dat se obţine una dintre valorile 1 sau 4.

De exemplu, pentru numărul natural 89, se obţin, pe rând, valorile 145, 42, 20, 4 iar pentru numărul natural 86, valorile rezultate sunt 100, 1.

Cerința

Dat un set de numere naturale, să se determine pentru fiecare dintre ele, numărul de repetări ale calculului sumei pătratelor cifrelor până la obţinerea rezultatului 1 sau 4.

Date de intrare

Fişierul de intrare unupatru.in conţine pe prima linie o valoare naturală n, care reprezintă numărul de numere naturale care vor fi testate. Pe linia a doua a fişierului de intrare se găsesc cele n numere naturale, separate prin câte un spaţiu.

Date de ieșire

Fişierul de ieşire unupatru.out conţine pe prima linie n numere naturale, care indică, în ordinea din fişierul de intrare, numărul de repetări ale calculului pentru fiecare dintre cele n numere din fişierul de intrare.

Restricții și precizări

  • 1 <= n <= 10
  • 1 <= numerele testate <= 1018

Exemplul 1:

unupatru.in

2
89 68

unupatru.out

4 2

Explicație

Se obţin, pe rând, pentru 89, valorile 145 42 20 4
Se obţin, pe rând, pentru 68, valorile 100 1

Exemplul 2:

unupatru.in

3
33 17 638

unupatru.out

10 9 5

Explicație

Valorile obţinute pentru cele 3 valori sunt:
18 65 61 37 58 89 145 42 20 4
50 25 29 85 89 145 42 20 4
109 82 68 100 1

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema UnuPatru:

//marinel serban - ianuarie 2013
#include <fstream>

using namespace std;

ifstream fin("unupatru.in");
ofstream fout("unupatru.out");

int n, i, nr_op, uc;
long long x, s2;

int main()
{
    fin >> n;                      //numarul de numere
    for (i = 1; i <= n; i++)       //pentru fiecare numar
    {
        fin >> x;                     //il citesc in x
        nr_op = 0;                    //initializez numarul de operatii
        while (x != 1 && x != 4)      //cat timp nu am obtinut 1 sau 4
        {
            s2 = 0;                     //initializez suma patratelor cu 0
            nr_op++;                    //contorizez calculul
            while (x)                   //cat timp mai exista cifre in x
            {
                uc = x % 10;              //scot ultima cifra
                s2 += uc * uc;            //adun patratul cifrei
                x /= 10;                  //scap de ea
            }
            x = s2;                     //s2 este noul x
        }
        if (i < n)                    //daca i < n nr_op trebuie urmat de spatiu
            fout << nr_op << ' ';
        else
            fout << nr_op << '\n';    //altfel (ultimul numar) se termina cu '\n'
    }
    fout.close();
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2099 UnuPatru

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2099 UnuPatru de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!