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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2013, 15:19   #11
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Цитата:
Так вот... Можно выделить нужное число байт под 100 разрядное число. Через двоичный логарифм это даже вычисляется легко. Только вот обрабатывать потом это дело будет неудобно, т.к. хранение то будет в двоичной системе, а операции основаны на десятичной.
Пробовал и этот вариант. очень не удобно на самом деле.

Цитата:
ЗЫ. Я так понимаю, что это учебная задача, поэтому особо заморачиваться тут не стоит.
Да это учебная задача. Так на досуге задался вопросом.

Цитата:
В реальном коде всё равно будут использоваться для этого проверенные временем библиотеки.
Хотелось бы взглянуть на исходники такой библиотеки. Так для повышения образованности)))

Если копать глубже. То есть ведь тип данных long long. Вроде там используются два регистра по 32 бита спаренные, и того 64 бита. А нельзя ли написать аналог для хранения например 128 битного числа?
Может это и чушь, но это моя чушь и я ее никому не отдам.

Последний раз редактировалось Shad0wF1rst; 11.01.2013 в 15:21.
Shad0wF1rst вне форума Ответить с цитированием
Старый 11.01.2013, 15:37   #12
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

А кто привязывает Вас к десятичным цифрам-то? Длинные числа выводить надо редко, а складывать часто - ergo, внутреннее представление должно быть удобно для второго.
Код:
uint16_t *first, *second, *sum;
size_t firstLength, secondLength, sumLength;
//...
uint32_t carry = 0, i;
for(i=0; i<max(firstLength, secondLength); ++i){
  carry += (uint32_t)first[i] + (uint32_t)second[i];
  sum[i] = carry & 0xFFFF;
  carry >>= 16;
}
if(carry == 0){
  sumLength = i;
} else {
  sum[i] = carry;
  sumLength = i+1;
}
Abstraction вне форума Ответить с цитированием
Старый 11.01.2013, 15:39   #13
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Если копать глубже. То есть ведь тип данных long long. Вроде там используются два регистра по 32 бита спаренные, и того 64 бита. А нельзя ли написать аналог для хранения например 128 битного числа?
А потом 256-битного, 512-битного... Регистры, правда, быстро кончатся.
Можете попробовать найти книгу "Криптография на C++" Вельшенбаха, в ней такая библиотека выстраивается.
Abstraction вне форума Ответить с цитированием
Старый 11.01.2013, 15:46   #14
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
Хорошо

Цитата:
Сообщение от Abstraction Посмотреть сообщение
А кто привязывает Вас к десятичным цифрам-то? Длинные числа выводить надо редко, а складывать часто - ergo, внутреннее представление должно быть удобно для второго.
Код:
uint16_t *first, *second, *sum;
size_t firstLength, secondLength, sumLength;
//...
uint32_t carry = 0, i;
for(i=0; i<max(firstLength, secondLength); ++i){
  carry += (uint32_t)first[i] + (uint32_t)second[i];
  sum[i] = carry & 0xFFFF;
  carry >>= 16;
}
if(carry == 0){
  sumLength = i;
} else {
  sum[i] = carry;
  sumLength = i+1;
}
Идея шикарная и очень интересная.
И самая главное простая.
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Старый 11.01.2013, 15:49   #15
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
А потом 256-битного, 512-битного... Регистры, правда, быстро кончатся.
Можете попробовать найти книгу "Криптография на C++" Вельшенбаха, в ней такая библиотека выстраивается.
Спасибо. обязательно посмотрю))
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Старый 12.01.2013, 10:27   #16
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
зачем обязательно char? Чем он отличается от int в данном случае?
char один байт int 4 или 8. разница жирная. но соцпроцессор все эти числа всё равно преобразовывает в int это только тормозит... с точки зрения оптимизации. дермовый вариант.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 14.01.2013, 10:51   #17
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

В принципе тему можно закрывать. После представленной идеи Abstraction, сразу пришло в голову и методы ввода подобных чисел с клавиатуры и вывода их на экран.

Спасибо всем за уделенное внимание к этой теме.
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать версию сервера? Vit@L БД в Delphi 2 04.11.2011 16:54
Олимпиадная задача просто интересно решения Pein95 Паскаль, Turbo Pascal, PascalABC.NET 5 14.12.2010 16:22
Узнать версию Indy из исходников FreeBrain Помощь студентам 2 01.09.2010 19:49
Узнать версию WINDOWS dimonbest Win Api 1 29.12.2008 12:07