Форум программистов, компьютерный форум, киберфорум
IrineK
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Перевод из/в любую систему исчисления от 2 до 36

Запись от IrineK размещена 07.02.2015 в 13:57
Показов 2627 Комментарии 0

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
//----------------------------------------------------------------------------
#include <iostream>
#include <sstream>
 
const std::string alphabet = "0123456789abcdefghijklmnopqrstuvwxyz";
typedef unsigned int UI; 
 
//---------------------------------------------------------------реверс строки
void Reverse (std::string &str)
{
    UI i = -1, j = str.length();
    while (++i < --j)
    {
        char temp = str[i];
        str[i] = str[j];
        str[j] = temp;
    }
}
//--------------------------------------------проверка соответствия числа системе 
bool ValidNumber (std::string &num, int base)
{
    if (base < 2 || base > 36)
        return false;
    
    UI i = -1;
    while (++i < num.length())
        if (alphabet.find(num[i]) >= base)
            return false;
    return true;
}
//---------------------------------------------------десятичное в любую систему
bool DecimalToBase(UI num, int dest_base, std::string &dest)
{   
    if (dest_base < 2 || dest_base > 36)
        return false;
    
    while (num)
    {   dest += alphabet [num % dest_base];
        num /= dest_base;
    }
    Reverse (dest);
    return true;
}
 
//---------------------------------------------------из любой системы в десятичное
bool BaseToDecimal (std::string &source, int source_base, UI &num)
{
    if (source_base < 2 || source_base >36)
        return false;
    
    if (!ValidNumber (source, source_base))
        return false;
    
    Reverse (source);
    UI i = -1, shift = 1;
    while (++i < source.length())
    {
        num += alphabet.find(source[i]) * shift;  
        shift *= source_base;
    }
    return true;
}
 
//--------------------------------------------------из любой системы в любую систему
bool BaseToBase (int source_base, std::string &source, int dest_base, std::string &dest)
{
    if (source_base < 2 || source_base >36 || dest_base < 2 || dest_base > 36)
        return false;
    
    if (!ValidNumber (source, source_base))
        return false;
    
    UI temp = 0;
     if (source_base != 10)
        BaseToDecimal (source, source_base, temp);
 
    DecimalToBase (temp, dest_base, dest);
    return true;
}
 
//----------------------------------------------------------------------------
int main()
{   
    //перевод из десятичной в любую систему
    std::string res = "\0";
    DecimalToBase (12345, 16, res);
    std::cout << res << "\n";
    
    //перевод из любой в десятичную
    UI num = 0;
    res = "ff";
    BaseToDecimal (res, 16, num);
    std::cout << num << "\n";
 
    //перевод из любой в любую
    std::string source = "123456";
    std::string dest = "\0";
    BaseToBase (7, source, 16, dest); 
    std::cout << dest;
    
    std::cin.get();
    return 0;
}
//-----------------------------------------------------------------------------
Размещено в Строки
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru