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

Написать программу, которая переводит число из десятичной системы счисления в позиционную систему счисления

24.02.2016, 20:30. Показов 4307. Ответов 12
Метки c++ (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите написать программу, которая переводит число из десятичной системы счисления в позиционную систему счисления. Цифра в самом младшем (нулевом) разряде этой системы счисления может принимать значения A, 0, 1,
где буква A соответствует -1. Цифра в первом разряде может принимать значения B, A, 0, 1, 2, где буква A соответствует -1, а буква B соответствует -2. Цифра во втором разряде может принимать
значения C, B, A, 0, 1, 2, 3, цифра в третьем разряде может принимать
значения D, C, B, A, 0, 1, 2, 3, 4 и т. д.
В этой системе счисления десятичные числа от -6 до 6
представляются как B0, B1, AA, A0, A1, A, 0, 1, 1A, 10, 11, 2A, 20.

Нужна программа или хотя бы наводка
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.02.2016, 20:30
Ответы с готовыми решениями:

Составить программу, которая переводит число из десятичной системы счисления в двоичную в обратном порядке ( 2
Составить программу, которая переводит число из десятичной системы счисления в двоичную в обратном...

Написать программу, которая переводит число из 13-й системы счисления в 3-ю через 10-ю
Написать программу, которая переводит число из 13-й системы счисления в 3-ю через 10-ю!

Написать программу, которая переводит число из 4-й системы счисления в 14-ю через 10-ю
Написать программу, которая переводит число из 4-й системы счисления в 14-ю через 10-ю. Сделайте,...

Написать функцию, которая переводит число в другую систему счисления
Написать функцию, которая получает в качестве аргументов целое положительное число и систему...

12
0 / 0 / 0
Регистрация: 08.06.2014
Сообщений: 9
24.02.2016, 21:25  [ТС] 2
Что это значит?
0
Вездепух
Эксперт CЭксперт С++
12445 / 6542 / 1757
Регистрация: 18.10.2014
Сообщений: 16,498
24.02.2016, 21:42 3
(Это значит "я написал ерунду и решил удалить свое сообщение")

Итак.

Сначала надо заметить, что веса разрядов в таковой системе счисления будут следующими:

1, 3, 15, 105, 945, ...

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

Там образом разряды, взятые по отдельности, могут предоставлять следующие значения (нумеруя разряды с 0)

Разряд 0: -1, 0, 1
Разряд 1: -6, -3, 0, 3, 6
Разряд 2: -45, -30, -15, 0, 15, 30, 45
Разряд 3: -420, -315, -210, -105, 0, 105, 210, 315, 420
...

Перевод произвольного числа N в эту систему счисления можно производить "лобовым" алгоритмом, применимым к любой системе счисления:
1. Берем исходное число N и находим ближайшее к нему число D, представимое одним разрядом (т.е. из списка выше). Используем этот разряд.
2. Вычитаем из исходного числа N число D: N = N - D
3. Переходим на шаг 1, пока N не превратится в 0

Например, переведем в эту систему счисления число 181:

- Для 181 ближайшим одноразрядным числом является число 210. Это разряд 3, цифра 2. Итого получаем 2***. Остаток 181 - 210 = -29
- Для -29 ближайшим одноразрядным числом является число -30. Это разряд 2, цифра B. Итого получаем 2B**. Остаток -29 - -30 = 1
- Для 1 ближайшим одноразрядным числом является число 1. Это разряд 0, цифра 1. Итого получаем 2B01. Остаток 0. Все.

В таком алгоритме самое неприятное - это поиск ближайшего одноразрядного числа. Я пока не вижу остроумных способов решения этой задачи. Т.е. пока предлагается просто тупо (или почти тупо) генерировать все одноразрядные числа в поиске ближайшего. Это не сложно.
1
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
24.02.2016, 23:40 4
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
//программу, которая переводит число из десятичной системы счисления в позиционную
//систему счисления. Цифра в самом младшем (нулевом) разряде этой системы счисления
//может принимать значения A, 0, 1,
//где буква A соответствует -1. Цифра в первом разряде может принимать
//значения B, A, 0, 1, 2, где буква A соответствует -1, а буква B соответствует -2.
//Цифра во втором разряде может принимать
//значения C, B, A, 0, 1, 2, 3, цифра в третьем разряде может принимать
//значения D, C, B, A, 0, 1, 2, 3, 4 и т. д.
//В этой системе счисления десятичные числа от -6 до 6
//представляются как B0, B1, AA, A0, A1, A, 0, 1, 1A, 10, 11, 2A, 20.
///////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cmath>
#include <iostream>
#include <string>
///////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
///////////////////////////////////////////////////////////////////////////////
T_str   pos_A01_val( int    n )
{
    T_str   res;
 
    for( double  d{3}; ; d += 2 )
    {
        int     n_new   =   round( n / d );
        int     dig     =   n   -   n_new * d;
 
        if  (
                abs( dig )  >   9
            )
        {
            res     =   "very large number";
            return  res;
        }//if
 
        res.push_back
            (
                dig     >=  0
                    ?   '0' + dig
                    :   'A' - dig - 1
            );
 
        if  (
                !( n = n_new )
            )
        {
            break;
        }
    }//for
 
    std::reverse
        (
            res.begin   (),
            res.end     ()
        );
 
    return  res;
}
///////////////////////////////////////////////////////////////////////////////
int     main()
{
    for(;;)
    {
        std::cout   <<  "n = ";
        int     n{};
        std::cin    >>  n;
 
        std::cout   <<  pos_A01_val(n)
                    <<  std::endl
                    <<  std::endl;
    }//for
}
1
Вездепух
Эксперт CЭксперт С++
12445 / 6542 / 1757
Регистрация: 18.10.2014
Сообщений: 16,498
25.02.2016, 02:05 5
Вот, например, реализация алгоритмом сверху-вниз

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
#include <string>
#include <iostream>
 
std::string convert(int n)
{
  int weight, digit_index;
 
  // Ascend: find the most significant digit index and its weight
 
  for (weight = 1, digit_index = 0; ; ++digit_index, weight *= digit_index * 2 + 1)
  {
    int max_range = (digit_index + 1) * weight + weight / 2;
    if (-max_range <= n && n <= max_range)
      break;
  }
 
  // Descend: conversion
 
  std::string r;
 
  for (; digit_index >= 0; weight /= digit_index * 2 + 1, --digit_index)
  {
    int min_range = weight - weight / 2;
    int digit = 
      n <= -min_range ? (n + min_range) / weight - 1 :
      n >= min_range ? (n - min_range) / weight + 1 :
      0;
    r += digit < 0 ? 'A' - digit - 1 : '0' + digit;
    n -= digit * weight;
  }
 
  return r;
}
 
int main()
{
  std::cout << convert(181) << std::endl;
}
1
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
25.02.2016, 06:07 6
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вот, например
Для больших интов не работает.
0
Вездепух
Эксперт CЭксперт С++
12445 / 6542 / 1757
Регистрация: 18.10.2014
Сообщений: 16,498
25.02.2016, 06:47 7
Цитата Сообщение от Mr.X Посмотреть сообщение
Для больших интов не работает.
Что именно вы имеете в виду? Что где-то у меня возникает арифметическое переполнение? Или что начиная с 9-го разряда цифр '1'..'9' уже не хватает, ибо появляются "цифры" '10' и выше?
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
25.02.2016, 07:41 8
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что именно вы имеете в виду? Что где-то у меня возникает арифметическое переполнение? Или что начиная с 9-го разряда цифр '1'..'9' уже не хватает, ибо появляются "цифры" '10' и выше?
А вы не тестировали что ли?
Цифр-то для интов хватит, а похоже на переполнение. INT_MAX / 7 еще считает, а INT_MAX / 6 уже нет.
0
0 / 0 / 0
Регистрация: 08.06.2014
Сообщений: 9
25.02.2016, 14:40  [ТС] 9
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Сначала надо заметить, что веса разрядов в таковой системе счисления будут следующими:
1, 3, 15, 105, 945, ...
Как и в любой позиционной системе счисления, вес каждого следующего разряда равен весу предыдущего разряда, умноженного на количество значений в предыдущем разряде.
А веса разрядов не должны быть равны степеням тройки (1, 3, 9, 27, 81...)?
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
25.02.2016, 15:21 10
Цитата Сообщение от vlad1 Посмотреть сообщение
А веса разрядов не должны быть равны степеням тройки (1, 3, 9, 27, 81...)?
Ну, тогда бы хватило трех цифр, остальные были бы излишними, а представления чисел неоднозначными.
1
0 / 0 / 0
Регистрация: 08.06.2014
Сообщений: 9
25.02.2016, 16:00  [ТС] 11
Спасибо всем!

Добавлено через 5 минут
Еще вопрос. Можно ли как-то определить количество цифр в числе, записанном в этой системе счисления, не переводя?
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
25.02.2016, 16:45 12
Цитата Сообщение от vlad1 Посмотреть сообщение
Еще вопрос. Можно ли как-то определить количество цифр в числе, записанном в этой системе счисления, не переводя?
Ну, в моей программе в каждой итерации цикла вместо вычисления и добавления цифры в результат просто инкрементируйте счетчик, и получите количество цифр.
0
Вездепух
Эксперт CЭксперт С++
12445 / 6542 / 1757
Регистрация: 18.10.2014
Сообщений: 16,498
25.02.2016, 17:26 13
Цитата Сообщение от vlad1 Посмотреть сообщение
Еще вопрос. Можно ли как-то определить количество цифр в числе, записанном в этой системе счисления, не переводя?
Преимуществом алгоритма перевода "сверху-вниз" в частности является то, что разряды генерируются в привычном порядке - от старших к младшим - и количество разрядов результата известно уже в начале работы алгоритма. В моем варианте первый цикл занимается как раз этим. После выполнения первого цикла переменная 'digit_index' как раз и будет содержать индекс старшего значащего разряда, т.е. фактически определять длину числа.

Разумеется, интересно было бы найти аналитическую формулу для определения длины числа, т.е. "сразу" без цикла. Для "обычных" систем счисления это делается просто через логарифм, а вот для такой хитрой системы есть ли прямая формула - не знаю.
1
25.02.2016, 17:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.02.2016, 17:26
Помогаю со студенческими работами здесь

Написать программу, которая переводит число в систему счисления с основанием 10
Дано число Ch в системе исчисления с основанием m. Написать программу, которая переводит число...

Написать программу, которая переводит заданное положительное число в р-ичную систему счисления (р<16)
Разработать алгоритм, написать и отладить программу на Basic, которая переводит заданное...

Создать программу, которая переводит числа из десятичной системы счисления в двоичную
создать программу, которая переводит числа из десятичной системы счисления в двоичную

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


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

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

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