IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Работа с олимпиадными серверами
Unconnected
сообщение 15.11.2008 19:40
Сообщение #1


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Сейчас распространена система онлайн-олимпиад,в данном случае по информатике. Понадобилось решить такую задачу.
Код
Задача 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.


У меня программа отрабатывает как надо, создаёт файл и записывает в него сумму чисел. А сервер выдаёт, что решение неверно. Я подозреваю, что проблема в ограничениях на входные данные, которые заданы в условии.

Сообщение отредактировано: Unconnected - 15.11.2008 19:43


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 15.11.2008 20:43
Сообщение #2


Гость






Ну, как минимум 2000000000 - это не в диапазоне типа Integer, скорее LongInt, если только не используется 32-битный компилятор. Но на всякий случай делай именно LongInt.

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

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

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

P.S.
Цитата
Задача можно сказать наипростейшая
Думаешь? А что будет, если сумма чисел будет больше 231? Скажем, 2000000000 и 2000000000 ? Это даже в LongInt уже не влезет...
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 23:04
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"