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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2016, 14:38   #1
dimon_snake
Форумчанин
 
Регистрация: 05.11.2015
Сообщений: 167
По умолчанию Долгая работа программы

Здравствуйте
Нужна ваша помощь
Создал программу, но работает одна ну слииишком долго
Дан файл с разбросанными по нему числами, числа могут быть до 10^18.
Нужно вывести в выходной файл сумму цифр всех тех чисел в обратном порядке.
longint не вмещает 10^18, поэтому воспользовался строками
Читал каждую строку файла, искал там числа, когда находил, считал сумму и кидал в массив
Вышло следующее
Код:
var
fi,fo:text;
s:array [1..100] of string;
i,a,l,k,n,ch:integer;
sum:array[1..10000] of byte;
begin
Assign(fi,'D:\sums.txt');
Assign(fo,'D:\sums2.txt');
Reset(fi);
Rewrite(fo);
i:=0;
while not eof(fi) do 
begin
    while not eoln(fi) do 
    begin
        inc(i);
        Read(fi,s[i]);
    end;
    readln;
end;
ch:=0;
for k:=1 to i do 
begin
    for a:=1 to length(s[k]) do 
    begin
        if (s[k][a] in ['0'..'9']) and  not(s[k][a-1] in ['0'..'9']) then 
        begin
            inc(ch);
            l:=0;
        end;
        if s[k][a] in ['0'..'9'] then 
        begin
            val(s[k][a],n);
            l:=l+n;
            n:=0;
        end;
        if (s[k][a] in ['0'..'9']) and not (s[k][a+1]  in ['0'..'9']) then
        sum[ch]:=l;
    end;
end;
for k:=ch downto 1 do Write(fo,sum[k],' ');
Close(fo);
Close(fi);
end.
Даже четыре числа он обрабатывает секунд пять, а 10 чисел я и проверять не стал.
Почему так?

Последний раз редактировалось dimon_snake; 20.12.2016 в 14:40.
dimon_snake вне форума Ответить с цитированием
Старый 20.12.2016, 14:50   #2
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

int64 не устраивает?
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Старый 20.12.2016, 15:06   #3
dimon_snake
Форумчанин
 
Регистрация: 05.11.2015
Сообщений: 167
По умолчанию

А в паскале такое есть?
dimon_snake вне форума Ответить с цитированием
Старый 20.12.2016, 15:10   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

а зачем нам вообще числа ЕСЛИ нужны нам исключительно ЦИФРЫ (то бишь ОТДЕЛЬНЫЕ символы строки из заданного и фиксированного множества).
Цитата:
сумму цифр всех тех чисел
Код:
sum:=0;
while not EOF(fi) do begin
  readln(txt);
  for j:=1 to length(txt) do
    case txt[j] of
    '0': sum:=sum +0;
    '1': sum:=sum +1;
    ...
    '9': sum:=sum +9;
    end;
end;
КОНЕЧНО есть вероятность что при этом надо ИСКЛЮЧАТЬ из суммирования БУКВЕННО-числовые идентификаторы. 'A23' '50Ю'
или надо ВКЛЮЧАТЬ другие кодировки чисел ($0ABCFF), а КАКИЕ цифры тогда надо считать?
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 20.12.2016 в 15:18.
evg_m вне форума Ответить с цитированием
Старый 20.12.2016, 15:14   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

dimon_snake, какой у Вас Паскаль?
Почему в программе задан массив на 10000 элементов, в файле не может быть больше чисел? Есть ограничения? Приведите точную формулировку задания.
и дайте пример входного файла (запаковать в архив, потом на сайте - Расширенный режим, управление вложениями, прикрепить файл).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.12.2016, 15:14   #6
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Похоже, нужно сначала сумму последнего числа, потом сумму предпоследнего и т.д.

Читай файл не как текстовый, а как типизированный типа char, например. Или можно как бинарный открыть. Это позволит читать файл с конца, что избавит от необходимости хранить суммы в массиве (можно сразу писать результат в выходной файл).
Если символ не цифра, то читаем файл дальше (идём ближе к началу), если цифра, то
Код:
если предыдущий символ (тот что ближе к началу файла) не цифра, то пишем в файл результат, 
а переменную для подсчёта суммы обнуляем, 
иначе прибавляем её значение в переменную для подсчёта суммы цифр
eoln вне форума Ответить с цитированием
Старый 20.12.2016, 15:15   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
а зачем нам вообще числа ЕСЛИ нам нужны исключительно ЦИФРЫ.
ну, для каждого ЧИСЛА сумму его цифр нужно посчитать и записать отдельно.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.12.2016, 15:17   #8
dimon_snake
Форумчанин
 
Регистрация: 05.11.2015
Сообщений: 167
По умолчанию

вы, наверное, не так поняли
нужно сначала найти сумму цифр каждого числа
допустим
дан файл с числами
1 2 12 34
нужно вывести суммы в обратном порядке ->
7 3 2 1
dimon_snake вне форума Ответить с цитированием
Старый 20.12.2016, 15:19   #9
dimon_snake
Форумчанин
 
Регистрация: 05.11.2015
Сообщений: 167
По умолчанию

free pascal 2.6.4
а 10000 стоит, потому что... размер заданного файла не превышает 512 Кб
Я не знал, сколько одно число весит, но думаю, там вряд ли будет больше 10000 чисел
dimon_snake вне форума Ответить с цитированием
Старый 20.12.2016, 15:30   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
n:=0; sum[n]:=0; 
while not EOF(fi) do begin
  readln(txt);
  isnum:=false; 
  for j:=1 to length(txt) do 
    case txt[j] of
    '0': begin sum[n]:=sum[n]+0; isnum:=true; end;
    '9'...
    else if isnum // если у нас и было число 
                  then begin// то оно  закончилось 
                     n:=n+1; // и надо переходить к следующему элементу массива
                     sum[n]:=0; isnum:=false; 
                  end;
    end;
  
  if isnum then begin n:=n+1; sum[n]=0; isnum:=false; end; 
end;

for j:=n-1 downto 0 do 
  writeln(sum[j]);
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 20.12.2016 в 15:44.
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очень долгая загрузка страницы usa-1500 PHP 5 09.02.2014 15:14
Долгая прорисовка DBGridEh Dozent Компоненты Delphi 0 02.08.2013 17:07
Долгая загрузка системы Дмитрий-1 Компьютерное железо 13 24.05.2013 12:29
Долгая загрузка программы Tulc Помощь студентам 4 20.11.2011 14:24
Долгая загрузка Windows XP sp3 DJ HITMAN Windows 14 04.09.2010 00:49