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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2015, 19:55   #1
Aspartum
 
Регистрация: 24.03.2015
Сообщений: 7
Смущение Трудности перевода. (Pascal -> C++)

Написал небольшой код. Решаю задачу про очень быстрое умножение длинных чисел. Удалось реализовать неплохой алгоритм. Но злой ТL не пропускает задачу. Опазадание всего на 0.009 секунды. В связи с етим принял решение про перенос кода на С++, ибо программы на нем пошустрее.
Собственно сам код:
Код:
type
 Numb = array[0..490000] of int64;
{$APPTYPE CONSOLE}
var
 a, b, c: numb;
 al,bl:longint;

procedure ReadLong(var A,B: Numb);
var
 c: array[1..245000] of char;
 t: char;
 i, l, n, k: longint;
begin
 n := 1;
 repeat
   read(t);
   if (t in ['0'..'9']) then begin
     c[n] := t; inc(n); inc(al);
   end;
 until (t = #13) or (t = ' ') or eof or eoln;
 l := 1; k := 1;
 for i := n - 1 downto 1 do
 begin
   a[l] := a[l] + (ord(c[i]) - 48) * k;
   k := k * 10;
   if (n - i) mod 8 = 0 then begin inc(l); k := 1; end;
 end;
 n := 1;
 repeat
   read(t);
   if (t in ['0'..'9']) then begin
     c[n] := t; inc(n); inc(bl);
   end;
 until (t = #13) or (t = ' ') or eof or eoln;
 l := 1; k := 1;
 for i := n - 1 downto 1 do
 begin
   b[l] := b[l] + (ord(c[i]) - 48) * k;
   k := k * 10;
   if (n - i) mod 8 = 0 then begin inc(l); k := 1; end;
 end;
end;

function dlina(const a: numb): longint;
var
 i: longint;
begin
 i := 195000;
 while(a [i] = 0) and (i > 1) do
   i := i - 1;
 dlina := i;
end;
  
 procedure umn(var a, b, c: Numb);
var
  i, j, k: longint;
begin
  for i := 1 to al do
  begin
    for j := 1 to bl do    
      c[i + j - 1] := c[i + j - 1] + a[i] * b[j];
    for k := 1 to dlina(c) do
    begin
      if c[k] > 99999999 then begin
        c[k + 1] := c[k + 1] + c[k] div 100000000;
        c[k] := c[k] mod 100000000;
      end; end;
  end;
end;


procedure wr(var a: Numb; k: longint);
begin
 if a[k] < 10 then write('0000000') else
 if a[k] < 100 then write('000000') else
 if a[k] < 1000 then write('00000') else
 if a[k] < 10000 then write('0000') else
 if a[k] < 100000 then write('000') else
 if a[k] < 1000000 then write('00') else
 if a[k] < 10000000 then write('0');
 write(a[k]);
end;

procedure WriteLong(var A: Numb);
var
 i: longint;
 fl: boolean;
begin
 for i := dlina(c) downto 1 do
 begin
   if fl = true then wr(a, i);
   if (a[i] > 0) and (fl = false) then begin
     write(a[i]); fl := true; end;
 end;
 if fl = false then write(0); writeln;
end;



begin
 assign(input,'input.txt'); reset(input);
 assign(output,'output.txt'); rewrite(output);
 Readlong(a,b);
 close(input);
 umn(a, b, c);
 WriteLong(c);
 close(output);
end.

Последний раз редактировалось Stilet; 24.03.2015 в 21:02.
Aspartum вне форума Ответить с цитированием
Старый 24.03.2015, 21:20   #2
Aspartum
 
Регистрация: 24.03.2015
Сообщений: 7
По умолчанию

UPD: Если данная просьба слишком сложная, прошу помочь хотя бы со сложными фрагментами кода.
Aspartum вне форума Ответить с цитированием
Старый 25.03.2015, 20:49   #3
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Где сложные фрагменты? Построчно пожалуйста.
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 25.03.2015, 23:36   #4
Aspartum
 
Регистрация: 24.03.2015
Сообщений: 7
По умолчанию

Процедура ReadLong. Все остальное терпимо..
Aspartum вне форума Ответить с цитированием
Старый 26.03.2015, 00:02   #5
Fenex
Форумчанин
 
Аватар для Fenex
 
Регистрация: 15.02.2012
Сообщений: 821
По умолчанию

Вся процедура от начала и до конца?
Т.е. даже этот код вызывает затруднения?
Код:
var
 c: array[1..245000] of char;
 t: char;
 i, l, n, k: longint;
begin
 n := 1;
^-.-^ My GitHub
Fenex вне форума Ответить с цитированием
Старый 26.03.2015, 00:15   #6
Aspartum
 
Регистрация: 24.03.2015
Сообщений: 7
По умолчанию

Нет. То только этот кусок.
Код:
repeat
   read(t);
   if (t in ['0'..'9']) then begin
     c[n] := t; inc(n); inc(al);
   end;
 until (t = #13) or (t = ' ') or eof or eoln;
 l := 1; k := 1;
 for i := n - 1 downto 1 do
 begin
   a[l] := a[l] + (ord(c[i]) - 48) * k;
   k := k * 10;
   if (n - i) mod 8 = 0 then begin inc(l); k := 1; end;
 end;
 n := 1;
 repeat
   read(t);
   if (t in ['0'..'9']) then begin
     c[n] := t; inc(n); inc(bl);
   end;
 until (t = #13) or (t = ' ') or eof or eoln;
 l := 1; k := 1;
 for i := n - 1 downto 1 do
 begin
   b[l] := b[l] + (ord(c[i]) - 48) * k;
   k := k * 10;
   if (n - i) mod 8 = 0 then begin inc(l); k := 1; end;
 end;
Aspartum вне форума Ответить с цитированием
Старый 26.03.2015, 05:15   #7
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Что делает эта процедура? - опиши словами
rrrFer вне форума Ответить с цитированием
Старый 26.03.2015, 10:49   #8
Aspartum
 
Регистрация: 24.03.2015
Сообщений: 7
По умолчанию

Эта процедура считывает 2 числа посимвольно, паралельно считает длину до тех пор пока не встретится пробел и конец строки. Затем переводит числа из массива char в массив integer(в данном случае int64).
Aspartum вне форума Ответить с цитированием
Старый 26.03.2015, 11:20   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Эта процедура считывает 2 числа посимвольно
перепиши процедуру и
Замени символьное чтение Read на блоковое(строчное) ReadLn.
и скорее всего не будет тебе
Цитата:
Опазадание всего на 0.009 секунды.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 26.03.2015, 12:48   #10
Aspartum
 
Регистрация: 24.03.2015
Сообщений: 7
По умолчанию

Строки имеют ограничение в длине(255 знаков). А число может быть до 10^195000.
По этому нельзя применять такой метод..
UPD: Вот само условие задачи: http://www.e-olimp.com.ua/ua/problems/317

Последний раз редактировалось Aspartum; 26.03.2015 в 12:52.
Aspartum вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интерфейсы в C++ и Delphi трудности перевода Celestia Общие вопросы C/C++ 3 25.04.2012 16:53
Трудности с массивами( pascal) Gekata Помощь студентам 6 21.01.2010 10:08
Трудности перевода Elidan Общие вопросы C/C++ 0 10.06.2009 01:49
Трудности перевода Maks1978 Свободное общение 6 30.05.2008 12:55
Трудности перевода проекта с С на Visual Studio 2005 С++ IP_Sergik Общие вопросы .NET 7 30.04.2008 16:23