Rezolvare completă PbInfo #2295 Baza

Cerința

Mirel a învățat astăzi la școală la ora de matematică despre baze de numerație. De exemplu a învățat cum să transforme un număr dintr-o bază oarecare în baza zece. Pentru acasă a primit următoarea temă:

Pentru un cuvânt dat, se înlocuiește fiecare literă a acestuia cu numărul de litere de dinaintea sa în alfabet, astfel litera a devine 0, litera b devine 1, litera c devine 2 ș.a.m.d. , iar cuvântul dat devine un număr în baza 26.

Să se transforme acest număr în baza zece.

Date de intrare

În fișierul baza.in se citește de pe prima linie un cuvânt, format doar din litere mici ale alfabetului englez.

Date de ieșire

În fișierul baza.out se va afișa pe prima linie un număr, reprezentând valoarea in baza zece a cuvântului din baza 26.

Restricții și precizări

  • Lungimea cuvântului <= 50

Exemplu

baza.in

abz

baza.out

51

Explicație

a = 0, b = 1, z = 25.
abz (26) = 0 * 26 ^ 2 + 1 * 26 ^ 1 + 25 * 26 ^ 0 = 51 (10)

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 Baza:

#include <fstream>
#include <cstring>

using namespace std;

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

int pw[150], ans[150];
char word[55];

void read();
void solve();
void write();
void addTo(int To[], int value);
void multiplyByConstant(int vec[], int value);

int main() {
    read();
    solve();
    write();

    return 0;
}

void read() {
    fin >> word;

    fin.close();
}

void solve() {
    int lg = strlen(word);

    pw[0] = pw[1] = 1;

    for(int i = lg - 1; i >= 0; --i) {
        addTo(ans, (int)(word[i] - 'a'));
        multiplyByConstant(pw, 26);
    }
}

void write() {
    for(int i = ans[0]; i > 0; --i) {
        fout << ans[i];
    }

    fout << '\n';

    fout.close();
}

void addTo(int To[], int value) {
    int toAdd[150];

    for(int i = 0; i < 150; ++i) {
        toAdd[i] = pw[i];
    }

    multiplyByConstant(toAdd, value);

    while(toAdd[0] > 1 && toAdd[toAdd[0]] == 0) --toAdd[0];

    int i = 1, t = 0;

    while(i <= To[0] || i <= toAdd[0] || t != 0) {
        To[i] = To[i] + toAdd[i] + t;
        t = To[i] / 10;
        To[i] %= 10;

        To[0] = max(To[0], i);
        ++i;
    }
}


void multiplyByConstant(int vec[], int value) {
    int t = 0;

    for(int i = 1; i <= vec[0] || t != 0; ++i) {
        vec[i] = vec[i] * value + t;
        t = vec[i] / 10;
        vec[i] %= 10;

        vec[0] = max(vec[0], i);
    }
}

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 #2295 Baza

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2295 Baza 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!