Jump to content
Hostul a fost schimbat. Daca vedeti serverul offline readaugati rpg.b-zone.ro sau 141.95.124.78:7777 in clientul de sa-mp ×

[C++] Cifrele unui număr


Andreigl
 Share

Recommended Posts

Determinarea cifrelor unui număr

Să ne gândim la un număr (natural), n = 274 – aici n este o variabilă de tip int.

Care dintre cifrele sale poate fi determinată cu o simplă operație aritmetică? Constatăm că putem determina ultima cifră a numărului cu operația C++ % 10 – restul împărțirii la 10. Într-adevăr, 274 % 10 este 4, adică ultima cifră (a unităților) a lui 274.

 

Cum putem determina cifra zecilor? Sigur, o soluție ar fi n % 100 / 10. Într-adevăr, n % 100 este 74, iar 74 /10 este 7. Ne amintim că, dacă operanzii sunt întregi, operația / reprezintă câtul împărțirii întregi.

Știm că n % 10 reprezintă cifra unităților lui n și vrem să determinăm cifra zecilor. Putem să modificăm mai întâi valoarea lui n, astfel: n = n / 10, și să determinăm ultima cifră a acestui număr. Este cifra unităților pentru valoarea curentă a lui n și cifra zecilor pentru valoarea inițială.

 

int n = 274;
cout << n % 10; // se va afisa 4
n = n / 10; // n devine 27
cout << n % 10; // se va afisa 7

Vom numi trunchiere operația prin care se elimină ultima cifră a valorii unei variabile întregi. Pentru a realiza trunchierea, folosim operația de atribuire și împărțirea la 10: n = n / 10 sau n /= 10.

Cum aflăm cifra sutelor? Trunchiem încă o dată valoarea lui n. n devine 2, iar n % 10 este 2, adică cifra sutelor pentru valoarea inițială a lui n. Mai mult, acum n are o singură cifră, și printr-o nouă trunchiere devine 0.

 

Să tragem câteva concluzii:

  1. ultima cifră a lui n este n % 10;
  2. prin trunchiere se elimină ultima cifră a lui n; ultima cifră a valorii curente este cifra zecilor a valorii inițiale;
  3. prin trunchieri succesive valoarea lui n devine 0. Numărul de trunchieri este în concordanță cu numărul de cifre din valoarea inițială a lui n.

 

Astfel, se conturează următorul program pentru determinarea cifrelor unui număr:

#include <iostream>

int main()
{
	int N; std::cin >> N;

	while (N != 0)
	{
		int Ultima_Cifra = N % 10;
		std::cout << Ultima_Cifra << " ";
		N /= 10; // sau N = N / 10;
	}

	return 0;
}

 

Dacă dorim să salvăm cifrele numărului într-un vector, avem varianta următoare:

#include <iostream>

int main()
{
	int N; std::cin >> N;
	int array[20], i = 0;

	while (N != 0) 
	{
		array[i++] = N % 10; 
		N /= 10;
	}

	for (; i > 0; i--)
		std::cout << array[i-1] << " ";
}

 

Am pus array[i-1] pentru că atunci când aflăm ultima cifră (adica atunci când numărul N este între 1 și 9), programul o salvează în vector, urmând să crească variabila i cu 1 și vectorul rămâne nul.

 

Recomand citirea tutorialelor:

  1. Palindromul / Oglinditul unui număr
  2. Matematica din spatele funcției Modulo

 

Vezi tutorialul original aici.

Edited by shanker'
Link to comment
Share on other sites

Câteva probleme (click pe ele pentru a accesa link-ul către problemă).

 

1. Suma cifrelor unui număr

#include <iostream>

int main()
{
	long long int Numar; // Numerele sunt cuprinse intre 1 si 2.000.000.000
	int Suma = 0; // Valoarea cea mai mare a acestei variabile ar putea fi 82 (atunci cand avem numarul 1 999 999 999)
  	

	std::cin >> Numar;
	while (Numar != 0)
	{
		Suma += Numar % 10;
		Numar /= 10;
	}

	std::cout << Suma;
}

 

2. Produsul cifrelor impare ale unui număr

#include <iostream>

int main()
{
	long long int Numar; std::cin >> Numar;
	int Produs = 1; // Il egalam cu 1 si nu cu 0 deoarece orice numar inmultit cu 0 ... este clar 0

	while (Numar != 0)
	{
		int Ultima_Cifra = Numar % 10;
		if (Ultima_Cifra % 2 != 0)	
			Produs *= Ultima_Cifra;
		Numar /= 10;
	}

	std::cout << Produs;
}

 

 

Link to comment
Share on other sites

27 minutes ago, shanker' said:

long long int Numar; // Numerele sunt cuprinse intre 1 si 2.000.000.000

2.147.483.647 = INT_MAX > 2.000.000.000, deci ajunge si int, nu trebuie long long int.

44 minutes ago, shanker' said:

Dacă dorim să salvăm cifrele numărului într-un vector, avem varianta următoare:

Ai uitat de "return 0;" in main().

Edited by Vesca
Link to comment
Share on other sites

O alta metoda de rezolvare a problemei este:

#include <iostream>
#include <string>

int main() {
    int number;
    std::cin >> number;

    int sum = 0;
    std::string num_str = std::to_string(number);

    for (const auto& character : num_str) {
        sum += character - '0';
    }

    std::cout << sum << '\n';

    return 0;
}

Sau chiar fara a citi intregul numar si a face calculele direct din citire:

#include <iostream>

int main() {
    int sum = 0;

    char cur_num;
    while (std::cin >> cur_num)
        sum += cur_num - '0';

    std::cout << sum << '\n';

    return 0;
}

 


De asemenea:

48 minutes ago, shanker' said:

if (Ultima_Cifra % 2 != 0)

Este mai performant si mai eficient sa verifici daca un numar este impar folosind

if (Ultima_Cifra & 1) { ... }

 

Edited by Vesca
Link to comment
Share on other sites

On 1/31/2020 at 6:14 PM, shanker' said:

@Vesca

 


if (Ultima_Cifra & 1) { ... }

Explică și de ce :)) 

Este o operatie pe biti. Se stie clar ca operatiile pe biti sunt mult, mult mai eficiente decat inmultirile si impartirile. Acest lucru se datoreaza faptului ca operatiile pe biti sunt suportate direct de catre procesor si nu folosesc foarte multe resurse. N-am ce sa explic aici, eventual cum functioneaza in spate, dar nu asta' ai intrebat. Ai intrebat doar de ce e mai eficient :D

 

"bitwise operations are substantially faster than division, several times faster than multiplication, and sometimes significantly faster than addition" - source

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.