Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
vlad1
0 / 0 / 0
Регистрация: 08.06.2014
Сообщений: 9
24.02.2016, 20:30     Написать программу, которая переводит число из десятичной системы счисления в позиционную систему счисления #1
Помогите написать программу, которая переводит число из десятичной системы счисления в позиционную систему счисления. Цифра в самом младшем (нулевом) разряде этой системы счисления может принимать значения 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.

Нужна программа или хотя бы наводка
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2016, 20:30     Написать программу, которая переводит число из десятичной системы счисления в позиционную систему счисления
Посмотрите здесь:

C++ написать программу, которая в произвольной строке ищет все числа в десятичной системе счисления(в соответствии со стандартом языка си) и заменяет их
C++ Написать программу, которая переводит число из 4-й системы счисления в 14-ю через 10-ю
C++ Написать программу, которая переводит число из 13-й системы счисления в 3-ю через 10-ю
C++ Составить рекурсивной функции, которая переводит числа из десятичной системы счисления в шестнадцатилетнюю
Написать функцию, которая переводит число в другую систему счисления C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vlad1
0 / 0 / 0
Регистрация: 08.06.2014
Сообщений: 9
24.02.2016, 21:25  [ТС]     Написать программу, которая переводит число из десятичной системы счисления в позиционную систему счисления #2
Что это значит?
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2786 / 1432 / 393
Регистрация: 18.10.2014
Сообщений: 2,632
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. Все.

В таком алгоритме самое неприятное - это поиск ближайшего одноразрядного числа. Я пока не вижу остроумных способов решения этой задачи. Т.е. пока предлагается просто тупо (или почти тупо) генерировать все одноразрядные числа в поиске ближайшего. Это не сложно.
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
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
}
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2786 / 1432 / 393
Регистрация: 18.10.2014
Сообщений: 2,632
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;
}
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
25.02.2016, 06:07     Написать программу, которая переводит число из десятичной системы счисления в позиционную систему счисления #6
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вот, например
Для больших интов не работает.
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2786 / 1432 / 393
Регистрация: 18.10.2014
Сообщений: 2,632
25.02.2016, 06:47     Написать программу, которая переводит число из десятичной системы счисления в позиционную систему счисления #7
Цитата Сообщение от Mr.X Посмотреть сообщение
Для больших интов не работает.
Что именно вы имеете в виду? Что где-то у меня возникает арифметическое переполнение? Или что начиная с 9-го разряда цифр '1'..'9' уже не хватает, ибо появляются "цифры" '10' и выше?
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
25.02.2016, 07:41     Написать программу, которая переводит число из десятичной системы счисления в позиционную систему счисления #8
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что именно вы имеете в виду? Что где-то у меня возникает арифметическое переполнение? Или что начиная с 9-го разряда цифр '1'..'9' уже не хватает, ибо появляются "цифры" '10' и выше?
А вы не тестировали что ли?
Цифр-то для интов хватит, а похоже на переполнение. INT_MAX / 7 еще считает, а INT_MAX / 6 уже нет.
vlad1
0 / 0 / 0
Регистрация: 08.06.2014
Сообщений: 9
25.02.2016, 14:40  [ТС]     Написать программу, которая переводит число из десятичной системы счисления в позиционную систему счисления #9
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Сначала надо заметить, что веса разрядов в таковой системе счисления будут следующими:
1, 3, 15, 105, 945, ...
Как и в любой позиционной системе счисления, вес каждого следующего разряда равен весу предыдущего разряда, умноженного на количество значений в предыдущем разряде.
А веса разрядов не должны быть равны степеням тройки (1, 3, 9, 27, 81...)?
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
25.02.2016, 15:21     Написать программу, которая переводит число из десятичной системы счисления в позиционную систему счисления #10
Цитата Сообщение от vlad1 Посмотреть сообщение
А веса разрядов не должны быть равны степеням тройки (1, 3, 9, 27, 81...)?
Ну, тогда бы хватило трех цифр, остальные были бы излишними, а представления чисел неоднозначными.
vlad1
0 / 0 / 0
Регистрация: 08.06.2014
Сообщений: 9
25.02.2016, 16:00  [ТС]     Написать программу, которая переводит число из десятичной системы счисления в позиционную систему счисления #11
Спасибо всем!

Добавлено через 5 минут
Еще вопрос. Можно ли как-то определить количество цифр в числе, записанном в этой системе счисления, не переводя?
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
25.02.2016, 16:45     Написать программу, которая переводит число из десятичной системы счисления в позиционную систему счисления #12
Цитата Сообщение от vlad1 Посмотреть сообщение
Еще вопрос. Можно ли как-то определить количество цифр в числе, записанном в этой системе счисления, не переводя?
Ну, в моей программе в каждой итерации цикла вместо вычисления и добавления цифры в результат просто инкрементируйте счетчик, и получите количество цифр.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2016, 17:26     Написать программу, которая переводит число из десятичной системы счисления в позиционную систему счисления
Еще ссылки по теме:

C++ Написать программу на с++ в функциях, которая переводит число из десятичной в двоичную систему
Написать программу, которая переводит десятичное число из двоичной системы в восьмеричную C++
C++ Преобразования из десятичной системы счисления в систему с основанием n С++

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

Или воспользуйтесь поиском по форуму:
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2786 / 1432 / 393
Регистрация: 18.10.2014
Сообщений: 2,632
25.02.2016, 17:26     Написать программу, которая переводит число из десятичной системы счисления в позиционную систему счисления #13
Цитата Сообщение от vlad1 Посмотреть сообщение
Еще вопрос. Можно ли как-то определить количество цифр в числе, записанном в этой системе счисления, не переводя?
Преимуществом алгоритма перевода "сверху-вниз" в частности является то, что разряды генерируются в привычном порядке - от старших к младшим - и количество разрядов результата известно уже в начале работы алгоритма. В моем варианте первый цикл занимается как раз этим. После выполнения первого цикла переменная 'digit_index' как раз и будет содержать индекс старшего значащего разряда, т.е. фактически определять длину числа.

Разумеется, интересно было бы найти аналитическую формулу для определения длины числа, т.е. "сразу" без цикла. Для "обычных" систем счисления это делается просто через логарифм, а вот для такой хитрой системы есть ли прямая формула - не знаю.
Yandex
Объявления
25.02.2016, 17:26     Написать программу, которая переводит число из десятичной системы счисления в позиционную систему счисления
Ответ Создать тему

Метки
c++
Опции темы

Текущее время: 22:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru