Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с олимпиадными серверами
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Unconnected
Сейчас распространена система онлайн-олимпиад,в данном случае по информатике. Понадобилось решить такую задачу.
Код
Задача 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
Ну, как минимум 2000000000 - это не в диапазоне типа Integer, скорее LongInt, если только не используется 32-битный компилятор. Но на всякий случай делай именно LongInt.

Да и не нужно это, читать строку, потом ее таким образом как ты делаешь, разбивать на 2 числа... Тем более, что ты это делаешь не совсем правильно: если в прочитанной строке перед числами будут пробелы (как в твоем посте, в цитате), то строка B останется пустой, а С будет содержать оба числа.

Все, что надо - читать непосредственно числа из файла:
  read(f1, b1); read(f1, c1);

, и писать тоже сразу число, без обратного преобразования в строку.

P.S.
Цитата
Задача можно сказать наипростейшая
Думаешь? А что будет, если сумма чисел будет больше 231? Скажем, 2000000000 и 2000000000 ? Это даже в LongInt уже не влезет...
Unconnected
Цитата
Ну, как минимум 2000000000 - это не в диапазоне типа Integer, скорее LongInt, если только не используется 32-битный компилятор. Но на всякий случай делай именно LongInt.

Так в том и дело, что я изменял на LongInt и отправлял, а сервер опять выдавал ошибку... Вообще я думал,что нужно сделать такой тип, границы диапазона которого не выходили бы за -2000000000 и 2000000000.

Цитата
Думаешь? А что будет, если сумма чисел будет больше 231? Скажем, 2000000000 и 2000000000 ? Это даже в LongInt уже не влезет...

В условии этого нет,поэтому и просто smile.gif
volvo
Цитата
В условии этого нет,поэтому и просто
Чего нет в условии? В условии нет ограничения на значение СУММЫ, в условии явно сказано: каждое из слагаемых не может превышать 2 млрд. А сумма - она и есть сумма, сколько получится - столько и надо вывести...

Прямая дорога в "Длинную арифметику"
Unconnected
Цитата
Чего нет в условии? В условии нет ограничения на значение СУММЫ, в условии явно сказано: каждое из слагаемых не может превышать 2 млрд. А сумма - она и есть сумма, сколько получится - столько и надо вывести...


И правда, прочёл невнимательно...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.