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

Cвязанные списки. Длинная арифметика. - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Оформление чёрного окна консоли VS C++ http://www.cyberforum.ru/cpp-beginners/thread68034.html
Здравствуйте. Как в си ++ в чёрном окне сделатать следующее: Нужно сделать заливку синим цветом и чтоб буквы голубым (Как в FAR'е). Нужно сделать размер окна на весь экран автоматом. Нужно в переменную записать текущие размеры окна (в пробелах). Нужно сделать выпадающую менюшку как в FAR'е. Пожалуйста помогите....
C++ шестнатеричное число как в с++ преобразовать десятичное число в шестнатеричное? http://www.cyberforum.ru/cpp-beginners/thread68032.html
C++ Найти произведение чисел в массиве
кто может помочь #include <iostream.h> #include <stdlib.h> #define N 10 void main() { randomize(); for (int i=0;i<N;i++) {
Циклические очереди в C++ C++
Привеет всем;) нужно написать функции занесения и извлечения данных для циклической очереди???(обратите внимание на аргументы можно использовать перегрузку функций - так в задании написано:scratch:) простую очередь я вот так накидала(правильно ли?!!): struct Queue { int d; Queue *p; };
C++ Сортировка слов по алфавиту методом выбора. http://www.cyberforum.ru/cpp-beginners/thread68020.html
Как это дело реализовать? Задать числовое значение каждой букве в алфавите или же использовать аски ? Посоветуйте)
C++ Напишите пожалуйста програмный код) Здраствуйте! Помогите пожалуйста бедной)С++ 1)Написать программу используя функциюкоторая определяет:является ли число целым(с с помощью цикла for) 2)Написать программу которая заминяет отрицательные элементы массива на среднее арифметическое а положительные элементы на произведение элементов массива. подробнее

Показать сообщение отдельно
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
29.11.2009, 10:45     Cвязанные списки. Длинная арифметика.
Хорошо, разберёмся с алгоритмом. (Решаю задачу вместе с Вами, если покажется, что где-то ошибка - указывайте на неё)
Для начала давайте наложим следующие ограничения на задачу: пусть степень и число будут положительными целыми числами. Запятую и отрицительные основания будет добавить легко, отрицательные стрепени сложнее, но тоже можно.
Размышление вслух о представлении длинных чисел:
Тип unsigned long long int (далее ULLI) занимает 8 байт в памяти, следовательно в нём можно хранить числа меньшие 1,84*10^19. То есть 18 знаков без потери точности нам гарантированы. Все числа большие 18 знаков, будем называть большими. Именно для их хранения мы будем использовать список (кстати, это обязательное условие? массив был бы проще.). Таким образом мы будем использовать две системы счисления: с основаниями десять и ridex соответственно. ridex должен быть таким, чтобы все простые операции которые мы будем использовать не выкинули нас за максимальное значение ULLI. С удобным нам значением ridex определимся чуть позже, после того как будут известны операции.
Пример: Пусть наша степень р=13!=6227020800(dec) тогда, если ridex=1000, то:
p=13!= 800*ridex^0+20*ridex^1+227*ridex^2+6*ridex^3 = 6_227_20_800(ridex~)
Давайте сразу договоримся о следующем: в десятичной системе счисления запись идет от старшего разряда к младшему, в нашей системе счисления запись будет вестись от младшего к старшему. Так нам будет проще выполнять операции сложения и умножения, то есть:
13!=800_20_227_6
Пара примеров.

для начала сложение:
Код
  
13!      = 800_20_227_6
+13!     = 800_20_227_6
=13!+13! = 600_41_454_12 //800+800 = 1600, то есть 600  и 1 в старший разряд.
теперь умножение (в данном случае - в столбик, как в школе):
Код
13!       = 800_20_227_6
13!       = 800_20_227_6 
------------------------------------------
            0_656_600_981_4                  //*на 800(ridex)
            (0)_0_416_540_124                   //*на 20(ridex). Число в скобках - поправка на разряд.
            (0)_(0)_600_721_533_413_1      //*на 227(ridex)
            (0)_(0)_(0)_800_124_362_37    //*на 6(ridex)
-----------------------------------------------------
13!*13!=0_656_616_43_788_775_38(ridex)

Из вышеизложенного следует две вещи: во-первых, для операции сложения необходимо ridex*10<1,84*10^19, для умножения необходимо ridex^2<1,84*10^19; во-вторых, написаных "знаний" достаточно для возведения числа в степень до 18 знаков длинной...
Что делать, если степень больше 1,84*10^19 ??? Только после чашки кофе...
 
Текущее время: 08:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru