Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Перевод чисел из 11-ричной в 12-ричную сс


Автор: непонял 30.11.2022, 22:38
не могу написать программу для перевода чисел из 11сс в 12сс  smile 

Автор: HexoGen(i)us 15.12.2022, 14:31
Алгоритм вашей программы:

1. Запросить строку у пользователя
2. Проверить что в строке введенной пользователем есть только цифры из 11-речной системы счисления
3. Перевести полученное число в 10 систему счисления умножая цифру из каждого разряда на соответствующую степень 11.
4. Перевести полученное десятичное число в 12 систему счисления последовательно деля число на 12 принимая полученный остаток за следующее найденное значение разряда
5. Вывести 12-ричное число заменяя полученные значения разрядов на соответствующие знаки...

На каком этапе вы остановились?

Автор: olmov 31.12.2022, 23:20
Код

/*не могу написать программу для перевода чисел из 11сс в 12сс */
#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>

using std::cin;
using std::cout;
using std::string;

void to_lower(string& str);
bool check_string(const string str, const string& alphabet);
size_t convert_to_dec(const string str, const string& alphabet);
string convert_to_base(unsigned int dec, const string alphabet);
size_t pow_base(size_t b, size_t n);

int main()
{
    const string alphabet("0123456789a");

    string line = "A2";
    cout << "Enter number: ";
    std::getline(cin, line);
    std::getchar();
    to_lower(line);
    cout << "\nLine= " << line << "\n";
    if (!check_string(line, alphabet))
    {
        cout << "11 decimal number entered incorrectly";
        return -1;
    }

    size_t v = convert_to_dec(line, alphabet);

    cout << "\nDec Value = " << v;
    string str = convert_to_base(v, "0123456789AB");

    cout << "\ntwelve Value = " << str;
    return 0;
}

size_t pow_base(size_t base, size_t num)
{
    size_t result = 1;
    if (num == 0)
    {
        return result;
    }
    if (num == 1)
    {
        return base;
    }
    result = base;
    for (size_t i = 1; i < num; i++)
    {
        result *= base;
    }
    return result;
}

string convert_to_base(unsigned int dec, const string alphabet)
{
    size_t remainder = 0;
    string str;
    size_t base = alphabet.size();
    while (dec > 0)
    {
        remainder = dec % base;
        dec = dec / base;
        str.append(1, alphabet.at(remainder));
    }
    std::reverse(str.begin(), str.end());
    return str;
}

size_t convert_to_dec(const string str, const string& alphabet)
{
    size_t base = alphabet.size();
    
    char ch;      
    size_t found; 
    size_t value = 0; 
    size_t j = 0;
    for (int i = str.size() - 1; i >= 0; i--)
    {  
        ch = str.at(i);
        found = alphabet.find(ch);
        value = value + found * pow_base(base, j++);
    }

    return value;
}

bool check_string(const string str, const string& alphabet)
{
    char ch;
    size_t found;
    for (size_t i = 0; i < str.size(); i++)
    {
        ch = str.at(i);
        found = alphabet.find(ch);
        if (found == string::npos)
            return false;
    }
    return true;
}

void to_lower(string& str)
{
    for (size_t i = 0; i < str.size(); i++)
    {
        str.at(i) = tolower(str.at(i));
    }
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)