Conversion d'un nombre entier dans une base quelconque

Description

Convertir un entier dans la base indiquée, ou bien lire un entier écrit dans la base connue, ce petit programme en C++ effectue cela avec des bases choisies entre 2 et 62. Il est bien évident qu'on peut aussi très facilement programmer diverses variantes du code source. L'image int2base.jpg incluse dans le zip en montre l'utilisation obtenue avec le fichier main.cpp joint.

Source :

#include <iostream>
#include <cstdint>
#include <string>
    
// Inversion d'une std::string
void reverseStr(std::string& str) {
    int n = str.length();
    for (int i = 0; i < n / 2; i++)
        std::swap(str[i], str[n-i-1]);
}
    
// Conversion en std::string d'un nombre entier en base b 
std::string int2base(int64_t x, int b) {
    std::string ch = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int s;
    if(x < 0) s = -1;
    else if(x == 0) return "0";
    else s = 1;
    x = s*x;
    std::string str;
    while(x > 0) {
        str = str + ch[x % b];
        x = x / b;
    }
    if(s < 0) str = str + "-"; 
    reverseStr(str);
    return str;
}
    
// Calcul d'un nombre entier écrit en base b
int64_t str2int(std::string str, int b) {
    std::string ch = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    // str[0] est le signe '-' ou le 1-er chiffre et str[ni] le dernier chiffre.
    int s = 1;
    if(str[0] == '-') {
        s = -1;
        str = str.substr(1);
    }
    int64_t n = 0, bi = 1;
    int ni = str.size()-1;
    for(int i=ni; i >= 0; i--) {
        int k = -1;
        for(int j=0; j < b; j++) if(str[i] == ch[j]) {k=j; break;}
        if(k == -1) {std::cout << "Erreur dans str2int()" << std::endl; return 0;}
        n = n + k * bi;
        bi = bi * b;
    }
    return s*n;
}

Codes Sources

A voir également