Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2016, 16:01   #1
bill
Форумчанин
 
Аватар для bill
 
Регистрация: 26.04.2007
Сообщений: 440
Восклицание Системы счисления

Привет!
Задача: есть массив из unsigned int, в нём хранится БОЛЬШОЕ число в системе счисления 2^32. Необходимо перевести его в 10 систему счисления и вернуть в виде строки.

Пусть сейчас сейчас массив насчитывает 16 элементов, число может составлять 512 бит=32*16. Перевести в двоичную с.с не проблема.
Если использовать стандартный алгоритм типа 2^0+2^1+2^2 + .. то при переводе в десятичную довольно быстро возникает переполнение.
Как можно решить задачу?

P.s сторонние библиотеки не интересуют
bill вне форума Ответить с цитированием
Старый 11.02.2016, 16:27   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Написать алгоритм деления.
waleri вне форума Ответить с цитированием
Старый 13.02.2016, 13:06   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
в системе счисления 2^32
основание СС = 4294967296? то есть каждый разряд 32 бита занимает?
Как звучит оригинал задания?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 15.02.2016, 16:08   #4
bill
Форумчанин
 
Аватар для bill
 
Регистрация: 26.04.2007
Сообщений: 440
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
основание СС = 4294967296? то есть каждый разряд 32 бита занимает?
Как звучит оригинал задания?
Вы правы, основание СС=2^32.
История такая: мне понадобилась длинная арифметика в с++. Длинное число представляется в виде массива. Но мне необходимо иметь доступ к элементам массива. Понятно, что можно взять готовую библиотеку. Я посмотрел в исходники GMP. Из коробки доступа к элементам я не имею. Можно поизвращаться, но не факт, что потом в ходе вычислений приложение будет работать корректно. Поэтому было принято решение о создании собственного велосипеда.
Почему 2^32? Это было навеяно топиком Более того, в GMP скорее всего тоже в 2^32.
bill вне форума Ответить с цитированием
Старый 15.02.2016, 16:18   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Тогда пиши класс, который будет работать с такими числами.
Только для отладки сделай основание системы счисления свойством-переменной и отлаживай методы на читабельных основаниях (2...16).
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 15.02.2016, 16:24   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Хотя я, хоть убей, не понимаю, зачем такую вещь использовать на практике.
Ведь, один хрен, все операции будут идти в двоичном коде. Не проще юзать строковую длинную арифметику?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 15.02.2016, 17:06   #7
bill
Форумчанин
 
Аватар для bill
 
Регистрация: 26.04.2007
Сообщений: 440
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Тогда пиши класс, который будет работать с такими числами.
Только для отладки сделай основание системы счисления свойством-переменной и отлаживай методы на читабельных основаниях (2...16).
Класс пишется, готово сложение и вычитание. Самое тяжелое впереди: */. Если я перевожу число в меньшую СС( пусть в 10), то необходимо реализовать алгоритм деления. Но при этом как хранить промежуточные результаты? Т.е я должен найти сумму вида, например, 1*(2^32)^0+..+1*(2^32)^8
Но при этом как искать числа вида (2^32)^8, а также саму сумму? На ум приходит использовать строки. Хранить в строковом массиве предвычисленные значения (2^32)^1, (2^32)^2 ... а потом поразрядно сделать сложение строк для получения итогового результата.

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Хотя я, хоть убей, не понимаю, зачем такую вещь использовать на практике.
Ведь, один хрен, все операции будут идти в двоичном коде. Не проще юзать строковую длинную арифметику?
Мне необходимо быстро вычленять из произвольного чиста куски определенного размера, несколько байт. Если хранить в строках в 10 сс, то тогда как вычленять их них скажем последние 4 байта, последние 8 байт числа?
bill вне форума Ответить с цитированием
Старый 15.02.2016, 17:14   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Если хранить в строках в 10 сс, то тогда как вычленять их них скажем последние 4 байта, последние 8 байт числа?
а ты храни не в 10сс, а в 16 сс. Тогда выдёргивать байты будет не просто, а очень просто.
Кстати, и строки не нужны, просто юзай длинный динамический массив байт.
И ещё: оч числах каких порядков речь идёть?

Всё, я домой пошёл. Минут через 20 вернусь.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 15.02.2016 в 17:16.
min@y™ вне форума Ответить с цитированием
Старый 15.02.2016, 17:44   #9
bill
Форумчанин
 
Аватар для bill
 
Регистрация: 26.04.2007
Сообщений: 440
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
а ты храни не в 10сс, а в 16 сс. Тогда выдёргивать байты будет не просто, а очень просто.
Кстати, и строки не нужны, просто юзай длинный динамический массив байт.
И ещё: оч числах каких порядков речь идёть?

Всё, я домой пошёл. Минут через 20 вернусь.
Думаю не более 2^1000.
Вместо массива возьму наверное, vector.
bill вне форума Ответить с цитированием
Старый 15.02.2016, 17:55   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Думаю не более 2^1000.
и это всё?? тьфу ты, 125 байт. можно даже статический тип юзать, как структуру __int64, только полей не 2 будет, а 4.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает преобразование кода из одной системы счисления в ID в другой системе счисления Ultran PHP 1 09.11.2013 21:15
системы счисления kat308 Помощь студентам 8 21.02.2013 09:48
Системы счисления counter Свободное общение 9 12.10.2011 18:15
Системы счисления c++ Kholmansky Помощь студентам 7 11.09.2011 06:10