Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 08.06.2014
Сообщений: 9

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

24.02.2016, 20:30. Показов 4911. Ответов 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.

Нужна программа или хотя бы наводка
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.02.2016, 20:30
Ответы с готовыми решениями:

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

Написать программу, которая переводит число из 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  [ТС]
Что это значит?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
24.02.2016, 21:42
(Это значит "я написал ерунду и решил удалить свое сообщение")

Итак.

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

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
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
24.02.2016, 23:40
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Эксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
25.02.2016, 02:05
Вот, например, реализация алгоритмом сверху-вниз

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
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
25.02.2016, 06:07
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вот, например
Для больших интов не работает.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
25.02.2016, 06:47
Цитата Сообщение от Mr.X Посмотреть сообщение
Для больших интов не работает.
Что именно вы имеете в виду? Что где-то у меня возникает арифметическое переполнение? Или что начиная с 9-го разряда цифр '1'..'9' уже не хватает, ибо появляются "цифры" '10' и выше?
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
25.02.2016, 07:41
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что именно вы имеете в виду? Что где-то у меня возникает арифметическое переполнение? Или что начиная с 9-го разряда цифр '1'..'9' уже не хватает, ибо появляются "цифры" '10' и выше?
А вы не тестировали что ли?
Цифр-то для интов хватит, а похоже на переполнение. INT_MAX / 7 еще считает, а INT_MAX / 6 уже нет.
0
0 / 0 / 0
Регистрация: 08.06.2014
Сообщений: 9
25.02.2016, 14:40  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Сначала надо заметить, что веса разрядов в таковой системе счисления будут следующими:
1, 3, 15, 105, 945, ...
Как и в любой позиционной системе счисления, вес каждого следующего разряда равен весу предыдущего разряда, умноженного на количество значений в предыдущем разряде.
А веса разрядов не должны быть равны степеням тройки (1, 3, 9, 27, 81...)?
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
25.02.2016, 15:21
Цитата Сообщение от vlad1 Посмотреть сообщение
А веса разрядов не должны быть равны степеням тройки (1, 3, 9, 27, 81...)?
Ну, тогда бы хватило трех цифр, остальные были бы излишними, а представления чисел неоднозначными.
1
0 / 0 / 0
Регистрация: 08.06.2014
Сообщений: 9
25.02.2016, 16:00  [ТС]
Спасибо всем!

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

Разумеется, интересно было бы найти аналитическую формулу для определения длины числа, т.е. "сразу" без цикла. Для "обычных" систем счисления это делается просто через логарифм, а вот для такой хитрой системы есть ли прямая формула - не знаю.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.02.2016, 17:26
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru