0 / 0 / 0
Регистрация: 02.05.2016
Сообщений: 1
1

Перевод из любой системы счисления в любую другую систему счисления (2-36)

30.09.2018, 21:56. Показов 38642. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет. 1 курс факультета ИВТ, изучаю С++ только один месяц. Из основного прошли строки, массивы, начали разбирать функции. Преподаватель информатики (др. предмет), увидев во мне способности (как назло сдал 3 лабы по экселю, ворду и легкой програмке), задал достаточно сложную в моём понимании задачу: написать программу на языке С++ для перевода чисел из любой системы счисления в другую. Особо никаких рамок нет, в интернете много способов решения этой задачи, но есть одно НО: я не хочу нести код, который я не смогу объяснить. В гугле я подсмотрел возможный алгоритм решения: перевести число в любую систему счисления, а из неё в любую нужную.

Собственно есть два куска кода:

1) Перевод из любой СС в десятичную:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream> 
#include <cmath>
 
using namespace std;
 
int main()
{
    int n,a; // a - cистема cчисления, n - вводимое число
    cin>>n>>a;
    int result=0;
    int cnt=0;
    while (n>0)
    {
        result+=n%10*pow(a,cnt++);
        n/=10;
    }
    cout<<result;
}
и 2) перевод из десятичной СС в любую другую (до 36):

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
#include <iostream>
 
using namespace std;
 
char int_symbol(int in){
    char out[]={'0','1','2','3','4','5','6','7','8','9',
    'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
    'Q','R','S','T','U','V','W','X','Y','Z'};
    return out[in];
}
 
void ten_base(int in, int base){
    if (in<base) {
        cout<<int_symbol(in);
        return;
    }
    ten_base(in/base,base);
    cout<<int_symbol(in%base);
}
 
 
int main(){
    setlocale(LC_ALL,'');
    int N;
    int n2;
    cout<<'Введите число : ';
    cin>>N;
    cout<<'Введите основание : ';
    cin>>n2;
    ten_base(N,n2);
    return 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
#include <iostream>
#include <cmath>
 
using namespace std;
 
char int_symbol(int in){                        //Описываем символы для вывода
    char out[]={'0','1','2','3','4','5','6','7','8','9',
    'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
    'Q','R','S','T','U','V','W','X','Y','Z'};
    return out[in];
}
 
void ten_base(int in, int base){
    if (in<base) {
        cout<<int_symbol(in);
        return;
    }
    ten_base(in/base,base);
    cout<<int_symbol(in%base);
}
 
int main()
{
    setlocale(LC_ALL,"");
    int N,a2,a;                             // a - исходная cистема cчисления, а2 - конечная система счисления, N - вводимое число
    cout<<"Введите исходное число : ";
    cin>>N;
    cout<<"Введите основание исходной системы счисления : ";
    cin>>a;
    cout<<"Введите основание конечной системы счисления : ";
    cin>>a2;
    cout<<"Конечное число : ";
    int result=0;
    int cnt=0;
    while (N>0)
    {
        result+=N%10*pow(a,cnt++);
        N/=10;
    }
    ten_base(result,a2);
    return 0;
}
В нём почти все работает. Беспокоит то, что при попытке ввода любой буквы (A-Z) в виде числа (используемых в СС 11-36) программа перестаёт работать. Вопрос, как исправить?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.09.2018, 21:56
Ответы с готовыми решениями:

Перевод из 10-ой в любую другую систему счисления.
#include&lt;iostream&gt; #include&lt;cstring&gt; using namespace std; void d_to_char(double x1,int osn, char...

Перевод из любой системы счисления в любую (от 2 и более. т.е. может перевести из 2й к примеру в 80ю)
Первый курс факультета информационных технологий, только только начали изучать c++, прошли лишь...

Перевод натурального числа из десятичной системы счисления в систему счисления по основанию
Здравствуйте. Я хотела бы попросить у вас помощи. Я понимаю, что это не очень красиво, но вдруг...

Рекурсия: перевод целого числа из десятичной системы счисления в 9 систему счисления
Написать рекурсивную функцию перевода целого числа из десятичной системы счисления в 9-чную...

3
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
30.09.2018, 22:48 2
Matthew1, может быть вам стоит понять такую простую вещь. В компьютере числа представлены в одной системе - двоичной (что впрочем, неважно. Есть экзотические компьютеры, использующие для внутреннего представления троичную с/с и даже еще более интересные). Что нас совершенно не должно интересовать. Нам нужно только знать, что при арифметических действиях результатом являются те же числа, правильно подсчитанные и представленные у компа внутри.
А системы счисления - это область символов (символьных строк). Можно хоть в римскую систему переводить. (те же символы).
Посему процесс перевода из одной с/с в другую состоит из двух этапов.
1. Перевод символьного представления из с/с-1 в машинное.
2. Перевод машинного представления в символьное с/с-2
Языки программирования часто для работы с 10 с/с делают эти переводы незаметными, естественными для программиста. И даже не ощущаются, как некие действия. Хотя они есть. Просто уже придуманы за вас разработчиками библиотек.

Ну и напоследок - бонус. В некоторых реализациях есть функция itoa(int value, char *s, int radix) Она прекрасно выполняет шаг 2. Думаю, код ее не сложно найти на просторах интернета. Да и самому написать, как говаривал пан Коровьев, - не бином Ньютона.
Главное тут понять, с какими сущностями приходится иметь дело.
Удачи вам!
0
30 / 21 / 8
Регистрация: 23.09.2018
Сообщений: 186
01.10.2018, 00:40 3
Вот так можно:
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
#include<iostream>
#include<fstream>
#include<string>
#include<cstdlib>
#include<sstream>
 
std::string ssystem (const char *command) {
    char tmpname [L_tmpnam];
    std::tmpnam ( tmpname );
    std::string scommand = command;
    std::string cmd = scommand + " >> " + tmpname;
    std::system(cmd.c_str());
    std::ifstream file(tmpname, std::ios::in );
    std::string result;
        if (file) {
      while (!file.eof()) result.push_back(file.get());
          file.close();
    }
    remove(tmpname);
    return result;
}
 
int main() {
    std::string input_value;
    int base1, base2;
    
    std::cout << "value? ";
    std::cin >> input_value;
    std::cout << "base1? ";
    std::cin >> base1;
    std::cout << "base2? ";
    std::cin >> base2;
 
    std::string cmd =
        "python -c \""
        "def numberToBase(s, b0, b):\n"
        "    n = int(s, b0)\n" 
        "    if n == 0:\n"
        "        return '0'\n"
        "    digits = []\n"
        "    while n:\n"
        "        digits.append(int(n % b))\n"
        "        n //= b\n"
        "    digits = digits[::-1]\n"
        "    return ' '.join(map(str, digits))\n"
        "print(numberToBase(\'";
    cmd += input_value + "\', " + std::to_string(base1) + ", " + std::to_string(base2) + "))\"";
    std::string output_cmd = ssystem(cmd.c_str());
    std::istringstream iss(output_cmd);
    std::string line;
    std::getline(iss, line);
    
    std::cout << "result: " << line << std::endl;
  
    return 0;
}
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
01.10.2018, 09:30 4
Лучший ответ Сообщение было отмечено Matthew1 как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void MyItoa(int v, char *s, int rad)
{
   int k = 0;
   while(v) {
      int x = v%rad;
      s[k++] = (x < 10) ? '0' + x : 'A' +x-10;
      v /= rad;
   }
    s[k] = 0;
    for(int i=0; i<k/2; i++) {  // Переворот
       int t = s[i];
       s[i] = s[k-i-1];
       s[k-i -1] = t;
    }
}
Добавлено через 9 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int MyAtoi(char *s, int rad)
{
   int n = 0;
   for(; *s!='\0'; s++) {
     int k;
     if (*s <= '9' && *s>='0') k = *s - '0';
     else if (*s >= 'a' && *s<= 'z') k = *s - 'a' + 10;
     else if (*s >= 'A' && *s<= 'Z') k = *s - 'A' + 10;
     else continue;
     n = rad*n + k;
   }
   return n;
}
Коды упрощены. Нет анализа правильности строки, проверки переполнения и прочих прикрас. Но идея вот такая, несложная....
2
01.10.2018, 09:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.10.2018, 09:30
Помогаю со студенческими работами здесь

Перевод числа из 8-ичной системы счисления в 16-ричную систему счисления и обратно.
Написать программу на С++. Перевод из 8 системы счисления в 16 систему счисления и обратно из 16...

Перевод числа из восьмеричной системы счисления в шестнадцатеричную систему счисления
Вот пример числа: 754 = 1EC 1000 = 200

Перевод строки из 2-ной системы счисления в 8-ную систему счисления
помогите пожалуйста как сделать перевод строки из 2 системы счисления на 8 систему счисления через...

Перевод чисел из двоичной системы счисления в систему счисления кратной степеням двойки и обратно
Нужно две программы, одна реализует перевод чисел из двоичной системы счисления в систему счисления...

Перевод чисел из 16 системы счисления в 2 систему счисления
Помогите составить программу для перевод чисел из 16 с/c в 2 c/c при условии,что программ может...

Перевод дробной части числа из десятичной системы счисления в любую другую систему счисления
Здравствуйте как перевести дробной части числа из десятичной системы счисления в любую другую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru