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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
vlad1
0 / 0 / 0
Регистрация: 08.06.2014
Сообщений: 9
#1

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

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

Помогите написать программу, которая переводит число из десятичной системы счисления в позиционную систему счисления. Цифра в самом младшем (нулевом) разряде этой системы счисления может принимать значения 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++):

Составить программу, которая переводит число из десятичной системы счисления в двоичную в обратном порядке ( 2 - C++
Составить программу, которая переводит число из десятичной системы счисления в двоичную в обратном порядке ( 2310 -> 111012). Пожалуйста,...

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
vlad1
0 / 0 / 0
Регистрация: 08.06.2014
Сообщений: 9
24.02.2016, 21:25  [ТС] #2
Что это значит?
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3801 / 2059 / 526
Регистрация: 18.10.2014
Сообщений: 3,665
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
Эксперт С++
3049 / 1694 / 265
Регистрация: 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
}
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3801 / 2059 / 526
Регистрация: 18.10.2014
Сообщений: 3,665
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
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
25.02.2016, 06:07 #6
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вот, например
Для больших интов не работает.
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3801 / 2059 / 526
Регистрация: 18.10.2014
Сообщений: 3,665
25.02.2016, 06:47 #7
Цитата Сообщение от Mr.X Посмотреть сообщение
Для больших интов не работает.
Что именно вы имеете в виду? Что где-то у меня возникает арифметическое переполнение? Или что начиная с 9-го разряда цифр '1'..'9' уже не хватает, ибо появляются "цифры" '10' и выше?
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
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
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
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
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
25.02.2016, 16:45 #12
Цитата Сообщение от vlad1 Посмотреть сообщение
Еще вопрос. Можно ли как-то определить количество цифр в числе, записанном в этой системе счисления, не переводя?
Ну, в моей программе в каждой итерации цикла вместо вычисления и добавления цифры в результат просто инкрементируйте счетчик, и получите количество цифр.
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3801 / 2059 / 526
Регистрация: 18.10.2014
Сообщений: 3,665
25.02.2016, 17:26 #13
Цитата Сообщение от vlad1 Посмотреть сообщение
Еще вопрос. Можно ли как-то определить количество цифр в числе, записанном в этой системе счисления, не переводя?
Преимуществом алгоритма перевода "сверху-вниз" в частности является то, что разряды генерируются в привычном порядке - от старших к младшим - и количество разрядов результата известно уже в начале работы алгоритма. В моем варианте первый цикл занимается как раз этим. После выполнения первого цикла переменная 'digit_index' как раз и будет содержать индекс старшего значащего разряда, т.е. фактически определять длину числа.

Разумеется, интересно было бы найти аналитическую формулу для определения длины числа, т.е. "сразу" без цикла. Для "обычных" систем счисления это делается просто через логарифм, а вот для такой хитрой системы есть ли прямая формула - не знаю.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2016, 17:26
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.02.2016, 17:26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru