Форум «Всё о Паскале» _ Задачи _ Работа с олимпиадными серверами
Автор: Unconnected 15.11.2008 23:40
Сейчас распространена система онлайн-олимпиад,в данном случае по информатике. Понадобилось решить такую задачу.
Код
Задача 1 «Сумма»
Имя входного файла: sum.in Имя выходного файла: sum.out Максимальное время работы на одном тесте: 2 секунды Максимальный объем используемой памяти: 64 мегабайта Максимальное количество баллов 100 баллов
Найти сумму двух чисел
Формат входных данных
Первая строка входного файла содержит два числа a, b и (-2000000000 <= a,b <= 2000000000). Числа в строках разделены пробелом.
Формат выходных данных
В выходном файле должна содержаться сумма этих чисел
Примеры входных и выходных файлов
sum.in sum.out 2 2 4 -10 10 0
Задача можно сказать наипростейшая. Я решил её так.
var inf,b,c,result2:string; x:char; a,b1,c1,result:integer; f1,f2:text; begin assign(f1,'sum.in'); reset(f1); assign(f2,'sum.out'); rewrite(f2); read(f1,inf); close(f1); for a:=1 to length(inf) do begin x:=inf[a]; if x<>' ' then b:=b+x else begin c:=copy(inf,a+1,length(inf)-a+1); break; end; end; val(b,b1,a); val(c,c1,a); result:=b1+c1; str(result,result2); write(f2,result2); close(f2); end.
У меня программа отрабатывает как надо, создаёт файл и записывает в него сумму чисел. А сервер выдаёт, что решение неверно. Я подозреваю, что проблема в ограничениях на входные данные, которые заданы в условии.
Автор: volvo 16.11.2008 0:43
Ну, как минимум 2000000000 - это не в диапазоне типа Integer, скорее LongInt, если только не используется 32-битный компилятор. Но на всякий случай делай именно LongInt.
Да и не нужно это, читать строку, потом ее таким образом как ты делаешь, разбивать на 2 числа... Тем более, что ты это делаешь не совсем правильно: если в прочитанной строке перед числами будут пробелы (как в твоем посте, в цитате), то строка B останется пустой, а С будет содержать оба числа.
Все, что надо - читать непосредственно числа из файла:
read(f1, b1); read(f1, c1);
, и писать тоже сразу число, без обратного преобразования в строку.
P.S.
Цитата
Задача можно сказать наипростейшая
Думаешь? А что будет, если сумма чисел будет больше 231? Скажем, 2000000000 и 2000000000 ? Это даже в LongInt уже не влезет...
Автор: Unconnected 16.11.2008 0:57
Цитата
Ну, как минимум 2000000000 - это не в диапазоне типа Integer, скорее LongInt, если только не используется 32-битный компилятор. Но на всякий случай делай именно LongInt.
Так в том и дело, что я изменял на LongInt и отправлял, а сервер опять выдавал ошибку... Вообще я думал,что нужно сделать такой тип, границы диапазона которого не выходили бы за -2000000000 и 2000000000.
Цитата
Думаешь? А что будет, если сумма чисел будет больше 231? Скажем, 2000000000 и 2000000000 ? Это даже в LongInt уже не влезет...
В условии этого нет,поэтому и просто
Автор: volvo 16.11.2008 1:33
Цитата
В условии этого нет,поэтому и просто
Чего нет в условии? В условии нет ограничения на значение СУММЫ, в условии явно сказано: каждое из слагаемых не может превышать 2 млрд. А сумма - она и есть сумма, сколько получится - столько и надо вывести...
Прямая дорога в "Длинную арифметику"
Автор: Unconnected 16.11.2008 16:29
Цитата
Чего нет в условии? В условии нет ограничения на значение СУММЫ, в условии явно сказано: каждое из слагаемых не может превышать 2 млрд. А сумма - она и есть сумма, сколько получится - столько и надо вывести...