| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Object Pascal: кроссплатформенные технологии > увеличение памяти... |
| Автор: Рыська 11.7.2005, 00:55 |
| Здравствуйте, я практически полный чайник в программировании |
| Автор: Romtek 11.7.2005, 01:26 |
| Использовать оверлеи и дополнительную память EMS, XMS. А лучше всего - оптимизировать потребление памяти. GetMem/FreeMem. |
| Автор: vadims 11.7.2005, 09:00 |
| Рыська Уточни что делает программа и на что именно расходуется и для чего не хватает памяти - вариантов решений может быть много |
| Автор: Remiznik 11.7.2005, 11:56 |
| точно ... а ешё лудше выложи исходник программы )))) |
| Автор: Рыська 11.7.2005, 15:09 |
| вообщем просто надо вывести на экран число 2^500... вот и все, выглядит это число так: 3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376 но паскаль мне выводит его только до 17 знака... |
| Автор: vadims 11.7.2005, 15:38 |
| Вообщем у тебя здесь проблемы спамятью вообще нет Просто чисел такой разрядности не поддерживает ни один из стандартных типов переменных Кокретно решение приводить сейчас нет времени но подход примерно следующий Тебе нужно найти алгоритмы умножений через сложения (как строятся микропрограммы для реализации умножений) и поэтапно их реализовывая ты будеш получать следующие цифры своего числа и выводить их Вообщем либо в поисковик либо в 'Алгоритмы' |
| Автор: Рыська 11.7.2005, 15:43 |
| vadims, спасибо большое=) |
| Автор: TP@MB@Y 11.7.2005, 17:35 | ||
| Рыська Я на первом курсе сдавал подобную задачку, только там надо было посчитать факториал большого числа. Вот исходник (думаю ты сможешь разобраться и заменить факториал на 2^n):
Константа predel если мне не изменят память отвечает за максимальное количество цифр в результате. |
| Автор: Romtek 11.7.2005, 17:55 |
| Это задача на длинную арифметику. Поиши в поисковике. |
| Автор: xibyte 12.7.2005, 16:46 | ||
| Смысл здесь в следующем. Нужен массив каждый элемент которого, соответствует разряду числа, которое должно в итоге получиться. Например число 143 можно представить следующим образом через массив m m[1]=3 // самый младший разряд m[2]=4 m[3]=1 // самый старший разряд Для наглядного примера возведем 2 в 5 степень. Естевственно, что нам нужно 5 раз умножить двойку саму на себя. Т.е. 2^5 = 2*2*2*2*2 = 1*2*2*2*2*2 .Создаем цикл, который будет этим заниматься. Только он будет поочередно умножать каждый разряд на двойку. На первой итерации будем умножать 1*2 следующим образом m[1]=1 * 2 = 2 m[2]=0 * 2 = 0 m[3]=0 * 2 = 0 На следующей итерации умножаем полученное число 2 опять на 2. Уже получаем 2^2 = 4 m[1]=2 * 2 = 4 m[2]=0 * 2 = 0 m[3]=0 * 2 = 0 Дальше также, получаем 2^3 = 8 m[1]=4 * 2 = 8 m[2]=0 * 2 = 0 m[3]=0 * 2 = 0 А вот дальше ИНТЕРЕСНЕЕ! Умножаем также каждый разряд на двойку m[1]=8 * 2 = 16 m[2]=0 * 2 = 0 m[3]=0 * 2 = 0 Первый элемент массива(то есть самый младший разряд) стал равен 16. Такого по определинию быть не может, т.к. разряд - это цифра. Это говорит нам о том, что нужно увеличть следующий разряд. Расскладываем число 16 = 1*10 + 6. В этом разряде мы должны оставить цифру 6. А единицу прибавляем к следующему более старшему разряду. В алгоритме будем находить эти числа следующим образом Шестерка - это результат целочисленного деления 16 на 10 (1 = 16 div 10), а шестерка это остаток от деления 16 на 10(6=16 mod 10). Получаем m[1]=8 * 2 = 6 m[2]=0 * 2 = 0+1 m[3]=0 * 2 = 0 Получили число 16=2^4 Дальше также умножаем каждый разряд на 2 m[1]=6 * 2 = 12 m[2]=1 * 2 = 2 m[3]=0 * 2 = 0 опять в первом разряде опять непорядок, опять расскладываем 12 на еденицу и двойку. Двойку оставляем в первом разряде, а еденицу прибавляем к более старшему. Получаем m[1]=6 * 2 = 2 = 2 m[2]=1 * 2 = 2+1 = 3 m[3]=0 * 2 = 0 = 0 Получили 2^5. Результатом является массив каждый элемент которого соответствует разряду числа. Печатаем в строчку элементы массива 032, и с начала убераем лишние нули -> 32. То же самое можно сделать и для 2^500. Только для этого нужно естевственно увеличить размер массива (то есть разрядность конечного числа) Ниже приведен код программы которая это делает
Надеюсь помог! |
| Автор: Рыська 13.7.2005, 00:29 |
| xibyte, спасибо огромное =)) |