Informatică, întrebare adresată de dragodavid16, 8 ani în urmă

Alexandra e pasionată de baze de numerație. Ea vrea sa calculeze cifra de control a unui număr în cea mai mică bază de numerație în care poate fi reprezentat acel număr. Se numește cifră de control a unui număr, cifra care se obține prin adunări repetate a cifrelor numărului până obținem o singură cifră. Exemplu: 1294 în baza 10 are suma cifrelor 16 care adunate din nou dau cifra de control 7. Dar Alexandra are la dispoziție un număr care poate conține nu doar cifre, ci și litere mari ale alfabetului. A înseamnă cifra 10, B cifra 11, …, Z cifra 35. Deci baza maximă posibilă este 36.​

Răspunsuri la întrebare

Răspuns de Apollyon
0

Răspuns:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int returneazaValoare(char caracterulCurent);

int sumaCifrelor(int nrCurent);

int main()

{

   char numarulInitial[25];

   printf("Introdu numarul ( de exemplu 32A ) >> ");

   scanf("%s", numarulInitial);

   int cifraDeControl = 0;

   for (int i = 0; i < (int)(strlen(numarulInitial)); i++)

       cifraDeControl += returneazaValoare(numarulInitial[i]);

   while (cifraDeControl >= 10)

       cifraDeControl = sumaCifrelor(cifraDeControl);

   printf("sumaCifre >> %d\n", cifraDeControl);

   return 0;

}

int returneazaValoare(char caracterulCurent)

{

   switch (caracterulCurent)

   {

   case '1':

       return 1;

   case '2':

       return 2;

   case '3':

       return 3;

   case '4':

       return 4;

   case '5':

       return 5;

   case '6':

       return 6;

   case '7':

       return 7;

   case '8':

       return 8;

   case '9':

       return 9;

   case 'A':

       return 10;

   case 'B':

       return 11;

   case 'C':

       return 12;

   case 'D':

       return 13;

   case 'E':

       return 14;

   case 'F':

       return 15;

   case 'G':

       return 16;

   case 'H':

       return 17;

   case 'I':

       return 18;

   case 'J':

       return 19;

   case 'K':

       return 20;

   case 'L':

       return 21;

   case 'M':

       return 22;

   case 'N':

       return 23;

   case 'O':

       return 24;

   case 'P':

       return 25;

   case 'Q':

       return 26;

   case 'R':

       return 27;

   case 'S':

       return 28;

   case 'T':

       return 29;

   case 'U':

       return 30;

   case 'V':

       return 31;

   case 'W':

       return 32;

   case 'X':

       return 33;

   case 'Y':

       return 34;

   case 'Z':

       return 35;

   default:

       return -999;

   }

}

int sumaCifrelor(int varNr)

{

   int sumaCifre = 0;

   while (varNr)

   {

       sumaCifre += varNr % 10;

       varNr /= 10;

   }

   return sumaCifre;

}

Explicație:

Salvezi „numărul” într-un șir de caractere după ai funcția returneazaValoare(...) care returnează valoarea caracterului și o adună în cifraDeControl. În while efectiv atribui suma cifrelor cifreiDeControl cât timp cifraDeControl e mai mare sau egală decât 10 ( că practic sumaDeControl trebuie să fie formată dintr-o cifră ) și la final printezi variabila.


andrei750238: Te-ai chinuit putin cu acel switch. Te puteai folosi de cod ASCII :

if(caracterulCurent>='0' && caracterulCurent<='9') return caracterulCurent-'0';
if(caracterulCurent>='A' && caracterulCurent<='Z') return caracterulCurent-'A'+10;
return -999
Apollyon: Da, ai dreptate, nu mi-a venit pe moment :)). Bine de știut pe viitor.
Alte întrebări interesante