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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2012, 11:46   #1
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию Олимпиадная задача "Золото племени АББА" на Pascal (№7 с acmp.ru)

Здравствуйте! Снова у меня вопрос по задаче из школы программистов - ссылка "Золото племени АББА"
В задаче надо сравнить 3 числа и вывести наибольшее. Казалось бы, полная ерунда, пару If-ов понатыкал и вывел наибольшее. Но такая программа почему-то не проходит некоторые тесты.
Решение я знаю. Там надо используя счетчики, посчитать самую длинную запись в строке, учитывать пробелы, одинаковые значения и т.д. много чего писать не буду.
Интересует, что же там такого не подходит роботу в программе с If-ами?

Вот пример моей попытки (не удивляйтесь, что она странноватая программа, я просто не понимая в чем дело усложнял ее):
Код:
var a,b,c:int64;
begin
assign (input, 'input.txt'); reset(input);
assign (output, 'output.txt'); rewrite(output);
read (a,b,c);
if (a<>b)and(b<>c)and(a<>c) then
 begin
 if (a>b)and(a>c) then write(a);
 if (b>a)and(b>c) then write(b);
 if (c>a)and(c>b) then write(c);
 end;
 
if (a=b)and(b=c) then write(a);

if (a=b)or(a=c)or(b=c) then
 begin
 if (a>b) then
  begin
  if (a>c)and(b=c) then write(a);
  end;
 if (a>c) then
  begin
  if (a>b)and(b=c) then write(a);
  end;
 if (b>a) then
  begin

  if (b=c) then write(b);
  end;
 if (b>c) then
  begin
  if (b>a)and(a=c) then write(b);
  if (b=a) then write(b);
  end;
 if (c>a) then
  begin
  if (c>b)and(a=b) then write(c);

  end;
 if (c>b) then
  begin
  if (a=c) then write(c);
  end;
 end;
end.
Ошибка в 9ом тесте:

Код:
Тест	Результат	Время	Память
1	Accepted	0,211  	948 Кб
2	Accepted	0,185  	936 Кб
3	Accepted	0,183   936 Кб
4	Accepted	0,202 	936 Кб
5	Accepted	0,172  	936 Кб
6	Accepted	0,183  	936 Кб
7	Accepted	0,19    936 Кб
8	Accepted	0,177  	936 Кб
9	Runtime error  0,183	940 Кб

Последний раз редактировалось Ghost3; 29.10.2012 в 11:50.
Ghost3 вне форума Ответить с цитированием
Старый 29.10.2012, 12:00   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Число из 100 цифр не влезает в int64.
Abstraction вне форума Ответить с цитированием
Старый 29.10.2012, 12:05   #3
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию

Гм... тфу, точно, что я так туплю.
И только из-за этого? И нет такого диапазона чисел, куда уместилось бы большое число?
Ghost3 вне форума Ответить с цитированием
Старый 29.10.2012, 12:44   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Сообщение от Ghost3 Посмотреть сообщение
Гм... тфу, точно, что я так туплю.
И только из-за этого? И нет такого диапазона чисел, куда уместилось бы большое число?
Существуют (разумеется, ибо на ней держится всё сегодняшнее асимметричное шифрование) классы/типы для сверхдлинной целочисленной арифметики. В большинстве языков они не входят в стандарт и являются сторонними библиотеками.
Abstraction вне форума Ответить с цитированием
Старый 29.10.2012, 14:06   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Код:
var
  c: char;
  s1, s2, s3: string;

function max(s1, s2: string): string;
var
  i: integer;
begin
  if length(s1) > length(s2) then
    max := s1
    else
  if length(s1) < length(s2) then
    max := s2
      else
  begin
    i := 1;
    while (i < length(s1)) and (s1[i] = s2[i]) do
      inc(i);
    if s1[i] > s2[i] then
      max := s1
    else
      max := s2;
  end;
end;

begin
  assign(input, 'input.txt'); reset(input);
  assign(output, 'output.txt'); rewrite(output);
  s1 := '';
  s2 := '';
  s3 := '';
  read(c);
  while(c <> ' ') do
  begin
    s1 := s1 + c;
    read(c);
  end; 
  read(c);
  while(c <> ' ') do
  begin
    s2 := s2 + c;
    read(c);
  end;
  readln(s3);
  writeln(max(max(s1, s2), s3));
end.
Update Подсмотрел код Serge - убрал 1 if в функции max.
Размер кода: 499
Код:
1	Accepted	0,09	56 Кб
2	Accepted	0,168	56 Кб
3	Accepted	0,169	924 Кб
4	Accepted	0,192	924 Кб
5	Accepted	0,174	924 Кб
6	Accepted	0,178	924 Кб
7	Accepted	0,173	924 Кб
8	Accepted	0,172	56 Кб
9	Accepted	0,188	56 Кб
10	Accepted	0,178	56 Кб
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 29.10.2012 в 16:15.
BDA вне форума Ответить с цитированием
Старый 29.10.2012, 14:17   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

раз пошла такая пьянка...
тогда я и своё решение приведу...
Код:
procedure ReadS(var S : string; var maxLen : byte);
var 
 q : char;
begin
  s := '';
  repeat
    read(q);
    if q<>' ' then 
       s:= s + q;
  until (q=' ') or eoln;
  if Length(s)>maxLen then maxLen := Length(s);
end;

function MaxS( const s1, s2 : string; maxLen : byte) : string;
var i : byte;
begin
if length(s1)<maxLen then MaxS := s2
else
  if length(s2)<maxLen then MaxS := s1
  else begin
    i := 1;
    while (s1[i]=s2[i]) and (i<length(s1)) do inc(i);
    if s1[i]>s2[i] then MaxS := s1
    else MaxS := s2
  end;
end;

var sA : array[1..3] of string;
 i, ml, cnt : byte;

begin
  reset(input, 'input.txt');
  rewrite(output, 'output.txt'); 
  ml := 0;
  for i:=1 to 3 do ReadS(sA[i], ml);

  WriteLn( MaxS( MaxS(sA[1], sA[2], ml), sA[3], ml));
end.

Размер кода 575

Цитата:
Код:
1	Accepted	 0,07	56 Кб
2	Accepted	 0,313	944 Кб
3	Accepted	 0,175	932 Кб
4	Accepted	 0,233	932 Кб
5	Accepted	 0,174	932 Кб
6	Accepted	 0,174	932 Кб
7	Accepted	 0,202	932 Кб
8	Accepted	 0,18	932 Кб
9	Accepted	 0,176	932 Кб
10	Accepted	 0,18	932 Кб

Последний раз редактировалось Serge_Bliznykov; 29.10.2012 в 14:23.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.01.2013, 11:40   #7
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию

Код:
Var a,b,c,o:string;
t:char;
i,u: longint;
Label w;
begin
assign (input, 'input.txt'); reset(input);
assign (output, 'output.txt'); rewrite(output);
Read(t);
a:=''; b:=''; c:=''; u:=0;
While t<>' ' do
begin
a:=a+t;
Read(t);
end;

Read(t);
While t<>' ' do
begin
b:=b+t;
Read(t);
end;

Read(t);
While not eof do
begin
if t<>' ' then c:=c+t;
Read(t);
end;

if length(a)>length(b) then
 begin
 if length(a)>length(c) then o:=a else o:=c;
 end;
if length(b)>length(a) then
 begin
 if length(b)>length(c) then o:=b else o:=c;
 end;
if length(c)>length(a) then
 begin
 if length(c)>length(b) then o:=c else o:=b;
 end;
if (length(a)=length(b))and(length(a)=length(c)) then
 begin
 for i:=1 to length(a) do
  begin
  if (ord(a[i])=ord(b[i]))and(ord(a[i])=ord(c[i])) then u:=u+1;
  if (ord(a[i])>ord(b[i]))and(ord(a[i])>ord(c[i])) then begin o:=a; goto w; end;
  if (ord(b[i])>ord(a[i]))and(ord(b[i])>ord(c[i])) then begin o:=b; goto w; end;
  if (ord(c[i])>ord(a[i]))and(ord(c[i])>ord(b[i])) then begin o:=c; goto w; end;
  end;
 if u=length(a) then o:=a;
 end;

w:
Write(o);
end.
Ввожу пример " 189285 283 4958439238923098349024", должно вывести естественно "4958439238923098349024", но он выводит вот это:
Код:
57
53
56
52
51
57
50
51
56
57
50
51
48
57
56
51
52
57
48
50
52
13
10
-1
4958439238923098349024
Откуда берутся эти маленькие числа?

Ps: пользуюсь PascalABC.NET, с файлами на компе не хочет работать в этой программе, приходится закрывать под комментарий строки, связанные с input\output и вводить через клаву значения =\

Последний раз редактировалось Ghost3; 17.01.2013 в 11:43.
Ghost3 вне форума Ответить с цитированием
Старый 17.01.2013, 12:06   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Пока не вижу причин появления этих чисел, но есть замечания по алгоритму:
Код:
if length(a)>length(b) then
 begin
 if length(a)>length(c) then o:=a else o:=c;
 end;
Если длина числа "а" больше числа "б" и больше числа "с", то "о" равно "а", но если "а" меньше "с", то почему "с" больше "б"?
Хотя, наверное, я не прав, т.к. потом, это значение будет заменено.
Лучше уж этот кусок написать:
Код:
if (length(a)>length(b)) and (length(a)>length(c)) then o:=a;
if (length(b)>length(a)) and (length(b)>length(c)) then o:=b;
if (length(c)>length(a)) and (length(c)>length(b)) then o:=c;
...
//вместо
if (ord(a[i])=ord(b[i]))and(ord(a[i])=ord(c[i])) then u:=u+1;
...
if u=length(a) then o:=a;
//можно написать
o:=a;
//т.к. если не было различных букв, то и так понятно, что все 3 числа равны
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 17.01.2013 в 12:13.
BDA вне форума Ответить с цитированием
Старый 17.01.2013, 12:21   #9
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию

Цитата:
то почему "с" больше "б"?
C>A>B, => C>B

Если "A>B" но "C>A" то "B" никак не может быть больше "C", ведь верно?

Да, спасибо за упрощение кода, но проблема остается =(
Ghost3 вне форума Ответить с цитированием
Старый 17.01.2013, 12:34   #10
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Откуда берутся эти маленькие числа?
Это коды символов от 48 ('0') до 57 ('9'), с завершающим 13,10 (конец строки, возврат каретки). Символы соответствуют "958439238923098349024". Ищите, почему функция вывода может так себя вести.
Abstraction вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
олимпиадная задача quade1992 Паскаль, Turbo Pascal, PascalABC.NET 0 17.05.2012 18:57
Олимпиадная задача "Карточки" (Pascal) rustkill Помощь студентам 1 01.05.2012 17:40
Олимпиадная задача Saidoz Паскаль, Turbo Pascal, PascalABC.NET 7 28.10.2011 13:02
олимпиадная задача danzel1 Общие вопросы C/C++ 2 21.10.2011 15:15
Олимпиадная задача Carbon Общие вопросы C/C++ 2 23.05.2007 22:07