На
нашем сайте несколько раз в неделю появляются
новые задачи. Многие из них не попадают в
рассылку. Поэтому заходите почаще на sapisoft.by.ru и
оставляйте сообщения в гостевой книге;). И ещё
вопрос к знающим людям. Где можно открыть хороший
форум для сайта? Пишите на sapisoft@yandex.ru.
Последовательность
(2 уровень)
Условие: Дана
последовательность целых чисел. Известно, что
все числа в ней встречаются четное количество
раз, кроме одного, которое встречается нечетное
число раз. Требуется написать программу, которая
определяет это число.
Технические требования:
Ограничение по времени тестирования:
по 2 секунды на один тест.
Формат входных данных:
Входной файл INPUT.TXT содержит заданную
последовательность. Каждое из чисел
последовательности больше -2147483649 и меньше 2147483648.
В каждой строке файла записано по одному числу.
Общее количество чисел в файле не превышает 500001.
Формат выходных данных:
Выходной файл OUTPUT.TXT должен содержать найденное
число.
Пример файлов входных и выходных
данных:
Input.txt
Output.txt
-1
2
-1
2
Решение:
---------- cut ----------
Рассмотрим следующую операцию сложения по
модулю 2: 0+0=0, 1+0=1, 0+1=1 и 1+1=0. Многозначные числа
будем складывать поразрядно после двоичного
разложения каждого из слагаемых. Так
определенная операция сложения обладает
следующими свойствами: a+0=a, a+a=0, a+b=b+a, (a+b)+c=a+(b+c).
Этих свойств достаточно, чтобы показать, что
такая сумма чисел, удовлетворяющих условиям
задачи, как раз и будет искомым числом.
Действительно, числа, которые встречаются четное
количество раз, дают в результате сложения 0
(после перегруппировки слагаемых), а, так как
только одно из них встречается нечетное число
раз, то оно и останется после всех сложений.
В математике и программировании описанное
сложение еще называют исключающим «или», а в
Турбо Паскале это сложение реализована как
операция «XOR» над целыми числами. Следуя авторам,
подсказка была заложена в названии задачи.
Приведенные соображения и реализованы в
программе:
---------- cut ----------
var
x, y : longint;
f, g : text;
begin
assign(f,'input.txt');
reset(f);
assign(g,'output.txt');
rewrite(g);
x:=0;
while not eof(f) do
begin
readln(f,y);
x:=x xor y;
end;
writeln(g,x);
close(g)
end.
Реклама
в рассылке:
Рассылки проекта Sapisoft:
Всегда
рады видеть Вас на нашем сайте. Жду ваших
предложений и замечаний, Шамис Алексей