Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.07.2011, 12:18
eletted eletted вне форума
Прохожий
 
Регистрация: 19.07.2011
Сообщения: 2
Репутация: 10
По умолчанию массивы уравниваются без команды, сами по себе

Пишу программу для работы с большими числами.Создал спец тип format. В него переконвертирую большие числа, а потом работаю с этими массивами(сложение, вычитание)
PHP код:
type
  format
=array of integer;
var
first,second:format
например, массив first[12345,6789,1] - это число 1.6789.12345
в ходе программы выполняется цикл, где
PHP код:
for i:=0 to dlina_first-do
    
begin
      first
[i]:=first[i]+second[i];
      if 
first[i]>=100000 then  
        begin
          
if i=dlina_first-1 then          //если некуда добавлять,то
            
setlength(first,dlina_first+1);//создаем новую ячейку массива
          
j:=first[idiv 100000;
          
first[i+1]:=first[i+1] + ;//добавляем в след ячейку
          
first[i]:=first[i]- j*sample;
        
end;
    
end

В общем, последовательно слагаю ячейки массивов. Если в получившейся ячейке массива first число не пятизначное, то я отсекаю от него лишние числа и эти отсечки складываю их со след ячейкой first (т.е. по принципу сложения в столбик).
ПРОБЛЕМА:
когда складываю один раз, то все нормально. Но когда ставлю цикл, где число складывается само с собой, получается новое число, его я складываю с самим собой, и т.д .По сути делаю возведение числа 2 в степень 64. до числа 262144 все идет норм. но когда складываю
262144+262144 получается не 524288, а 624288.
когда выполняется
PHP код:
if first[i]>=100000 then  
        begin
          
if i=dlina_first-1 then          //если некуда добавлять,то
            
setlength(first,dlina_first+1);//создаем новую ячейку массива
          
j:=first[idiv 100000;
          
first[i+1]:=first[i+1] + ;//добавляем в след ячейку
          
first[i]:=first[i]- j*sample;
        
end
то как бы автоматически выполняется и
PHP код:
second[i+1]:=second[i+1] + 
,а это искажает результат. Не могу понять почему меняется second автоматически?
Ответить с цитированием
  #2  
Старый 19.07.2011, 16:47
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

не усложнял бы и сделал сложение строк
по одному символу с конца в начало перебераешь и в новую строку добавляеш, одну переменную оставь для числа в уме
и хорошобы отдельной процедурой\функцией

этот щас слишком запутаный
где setlength наверно надо и dlina_first менять sample непонятно что такое

а по теме когда передаеш параметр как var он передается указателем
и когда summ(a, a) то и first и second указывают на одно место

Последний раз редактировалось Pyro, 19.07.2011 в 17:44.
Ответить с цитированием
  #3  
Старый 19.07.2011, 19:11
eletted eletted вне форума
Прохожий
 
Регистрация: 19.07.2011
Сообщения: 2
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pyro
а по теме когда передаеш параметр как var он передается указателем
и когда summ(a, a) то и first и second указывают на одно место
а как этого избежать?
да, кстати, забыл исправить sample на 100000
Ответить с цитированием
  #4  
Старый 01.08.2011, 11:24
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Цитата:
Сообщение от eletted
Пишу программу для работы с большими числами.Создал спец тип format. В него переконвертирую большие числа, а потом работаю с этими массивами(сложение, вычитание)
PHP код:
type
  format
=array of integer;
var
first,second:format
например, массив first[12345,6789,1] - это число 1.6789.12345
в ходе программы выполняется цикл, где
PHP код:
for i:=0 to dlina_first-do
    
begin
      first
[i]:=first[i]+second[i];
      if 
first[i]>=100000 then  
        begin
          
if i=dlina_first-1 then          //если некуда добавлять,то
            
setlength(first,dlina_first+1);//создаем новую ячейку массива
          
j:=first[idiv 100000;
          
first[i+1]:=first[i+1] + ;//добавляем в след ячейку
          
first[i]:=first[i]- j*sample;
        
end;
    
end

В общем, последовательно слагаю ячейки массивов. Если в получившейся ячейке массива first число не пятизначное, то я отсекаю от него лишние числа и эти отсечки складываю их со след ячейкой first (т.е. по принципу сложения в столбик).
ПРОБЛЕМА:
когда складываю один раз, то все нормально. Но когда ставлю цикл, где число складывается само с собой, получается новое число, его я складываю с самим собой, и т.д .По сути делаю возведение числа 2 в степень 64. до числа 262144 все идет норм. но когда складываю
262144+262144 получается не 524288, а 624288.
когда выполняется
PHP код:
if first[i]>=100000 then  
        begin
          
if i=dlina_first-1 then          //если некуда добавлять,то
            
setlength(first,dlina_first+1);//создаем новую ячейку массива
          
j:=first[idiv 100000;
          
first[i+1]:=first[i+1] + ;//добавляем в след ячейку
          
first[i]:=first[i]- j*sample;
        
end
то как бы автоматически выполняется и
PHP код:
second[i+1]:=second[i+1] + 
,а это искажает результат. Не могу понять почему меняется second автоматически?

Код:
if i=dlina_first-1 then          //если некуда добавлять,то 
begin
            setlength(first,dlina_first+1);//создаем новую ячейку массива 
            first[j+1]:=0; // не забыть обнулить
end;
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:10.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter