Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> увеличение памяти... 
:(
    Опции темы
Рыська
Дата 11.7.2005, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 11.7.2005
Где: Питер

Репутация: нет
Всего: нет



Здравствуйте, я практически полный чайник в программировании smile и мне задали программу, в которой не хватает памяти для реализации... не могли бы вы рассказать пару приемчиков или показать пару простейших примеров как это можно сделать...
PM MAIL ICQ   Вверх
Romtek
Дата 11.7.2005, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 7.12.2004
Где: Холон

Репутация: нет
Всего: 4



Использовать оверлеи и дополнительную память EMS, XMS.
А лучше всего - оптимизировать потребление памяти.

GetMem/FreeMem.
--------------------
Romiras HomeLab - материалы и статьи по разработке ПО, моделирование алгоритмов, обработка и анализ информации, нейронные сети, машинное зрение и пр.
PM WWW   Вверх
vadims
Дата 11.7.2005, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 8.6.2005

Репутация: нет
Всего: 17



Рыська Уточни что делает программа и на что именно расходуется и для чего не хватает памяти - вариантов решений может быть много


--------------------
Cpu not found ! Press any key for software emulation.
PM MAIL   Вверх
Remiznik
Дата 11.7.2005, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: нет
Всего: 1



точно ... а ешё лудше выложи исходник программы ))))
PM MAIL   Вверх
Рыська
Дата 11.7.2005, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 11.7.2005
Где: Питер

Репутация: нет
Всего: нет



вообщем просто надо вывести на экран число 2^500... вот и все,
выглядит это число так: 3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376
но паскаль мне выводит его только до 17 знака... smile и как дальше жить?
PM MAIL ICQ   Вверх
vadims
Дата 11.7.2005, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 8.6.2005

Репутация: нет
Всего: 17



Вообщем у тебя здесь проблемы спамятью вообще нет
Просто чисел такой разрядности не поддерживает ни один из стандартных типов переменных

Кокретно решение приводить сейчас нет времени но подход примерно следующий
Тебе нужно найти алгоритмы умножений через сложения (как строятся микропрограммы для реализации умножений)
и поэтапно их реализовывая ты будеш получать следующие цифры своего числа и выводить их

Вообщем либо в поисковик либо в 'Алгоритмы'

Это сообщение отредактировал(а) vadims - 11.7.2005, 15:41


--------------------
Cpu not found ! Press any key for software emulation.
PM MAIL   Вверх
Рыська
Дата 11.7.2005, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 11.7.2005
Где: Питер

Репутация: нет
Всего: нет



vadims, спасибо большое=)
PM MAIL ICQ   Вверх
TP@MB@Y
Дата 11.7.2005, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



Рыська

Я на первом курсе сдавал подобную задачку, только там надо было посчитать факториал большого числа.
Вот исходник (думаю ты сможешь разобраться и заменить факториал на 2^n):
Код

program faktorial;
uses crt;
const predel=152;
var i,j,k,n:integer;
    f:array[1..predel] of integer;
    ch:char;
{?®¤бзҐв Є®«-ў  жЁда зЁб« }
function kol_cif(a:integer):integer;
var s,q:integer;
begin
 q:=1;
 s:=10;
 while a div s<>0 do
  begin s:=s*10;q:=q+1;end;
 kol_cif:=q;
end;
{?ҐаҐе® ­  б«Ґ¤гойЁ© а §ап¤}
procedure razryad;
var x:integer;
begin
for x:=0 to i do
if kol_cif(f[i-x])>1 then begin
                          f[i-x-1]:=f[i-x-1]+(f[i-x] div 10);
                          f[i-x]:=f[i-x] mod 10;
                          end;
end;
{’…‹Ћ ??Ћѓ?ЂЊЊ›}
begin
repeat
 {‚ў®¤ ¤ ­­ле}
 repeat
  clrscr;
  writeln('‚ўҐ¤ЁвҐ зЁб«®, д Єв®аЁ « Є®в®а®Ј® е®вЁвҐ Ї®бзЁв вм');
  readln(n);
  if n<0 then begin
              textcolor(4);
              writeln('›››››››!!! >I ');
              delay(50000);
              textcolor(7);
              end;

 until n>=0;
f[predel]:=1;
for i:=1 to predel-1 do
f[i]:=0;
{‡ Ї®«­Ґ­ЁҐ "а §ап¤­®Ј®" ¬ ббЁў }
for j:=1 to n do
   for i:=1 to predel do
       begin
        f[i]:=f[i]*j;
        razryad;
       end;
{?а®ЇгбЄ "Їгбвле" а §а冷ў}
for i:=1 to predel do
if f[i]<>0 then begin k:=i;break end;
{‚лў®¤ аҐ§г«мв в }
textcolor(2);
if k<=predel then
               begin
               write('!=');
               for i:=k to predel do
               write(f[i])
               end
             else writeln('—Ёб«® ®зҐ­м Ў®«м讥');
writeln;
{‚л室???}
textcolor(1);
writeln('*****************************************');
textcolor(7);
writeln('[Їа®ЎҐ«]-ўл©вЁ  [«оЎ п ¤агЈ п]-Їа®¤®«¦Ёвм');
ch:=readkey;
until ch=' ';
end.


Константа predel если мне не изменят память отвечает за максимальное количество цифр в результате.
PM   Вверх
Romtek
Дата 11.7.2005, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 7.12.2004
Где: Холон

Репутация: нет
Всего: 4



Это задача на длинную арифметику. Поиши в поисковике.
--------------------
Romiras HomeLab - материалы и статьи по разработке ПО, моделирование алгоритмов, обработка и анализ информации, нейронные сети, машинное зрение и пр.
PM WWW   Вверх
xibyte
Дата 12.7.2005, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.7.2005

Репутация: нет
Всего: нет



Смысл здесь в следующем. Нужен массив каждый элемент которого, соответствует разряду числа, которое должно в итоге получиться. Например число 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. Только для этого нужно естевственно увеличить размер массива (то есть разрядность конечного числа)
Ниже приведен код программы которая это делает
Код

uses
 crt;
var
 m : array[1..300] of byte;
 stepen, osnova, iter, razryadnost,i,j,slR : integer;
 flag, exitt : boolean;
 f : text;

begin
                                        clrScr;
 stepen := 500;
 osnova := 2;
 iter := 1;
 razryadnost := 300;  {Должно совпадать с количеством элементов массива}
 for i := 2 to razryadnost do m[i] := 0;
 m[1] := 1;
repeat
 for i := razryadnost downto 1 do
  begin
   m[i] := m[i]*osnova;
   j := i;
   repeat
    exitt := true;
    if (m[j] div 10) <> 0 then
    begin
     slR := m[j] div 10;
     m[j] := m[j] mod 10;
     if j <> razryadnost then m[j+1] := m[j+1] +slR;
     exitt := false;
    end;
    inc(j);
   until (j=razryadnost) or exitt;
  end;
 inc(iter);
until (iter = stepen+1);


flag := false;
for i := razryadnost downto 1 do
  if (m[i] <> 0) or flag then
    begin
     write(m[i]);
     flag := true;
    end;

 repeat
 until keypressed;

end.


Надеюсь помог! smile
PM MAIL ICQ   Вверх
Рыська
Дата 13.7.2005, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 11.7.2005
Где: Питер

Репутация: нет
Всего: нет



xibyte, спасибо огромное =)) smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0795 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.