Нужно написать программу Шахматная доска состоит из n х m клеток, покрашенных в черный и...

0 голосов
339 просмотров

Нужно написать программу
Шахматная доска состоит из n х m клеток, покрашенных в черный и белый цвет в«шахматном» порядке. При этом клетка в левом нижнем углу доски покрашена в черный цвет определите, сколько всего на доске черных клето. Программа получает на вход два числа n и m, залисанных в отдельных строю Bсе натуральные, не превосходящие 30 000 числа Программа должна вывести одно целое число количество черных клеток на доске.


Информатика (15 баллов) | 339 просмотров
Дан 1 ответ
0 голосов
Правильный ответ

Рассмотрим случай, когда число клеток по вертикали n четное. В этом случае каждая пара горизонталей доски содержит ровно m клеток (m - число клеток доски по горизонтали). Тогда общее число черных клеток равно m*n/2.
При нечетном n к рассмотренным горизонтальным строкам добавляется еще одна - нечетная, конфигурация которой совпадает с первой (нечетной) горизонталью.
Если клетка в левом нижнем углу первой горизонтали черная, то количество черных клеток в ней можно определить как сумму результата целочисленного деления количества клеток по горизонтали на два и остатка от этого деления. В результате приходим к следующей формуле:
k=\begin {cases} \frac{mn}{2}, \ n \, mod \, 2=0 \\ \frac{m(n-1)}{2}+ (m \, div \, 2)+(m \, mod \, 2), \ n \, mod \, 2=1 \end {cases}

Ниже представлен текст программы на языке Pascal.ABC.NET

var
  m, n: integer;

begin
  Write('Введите количество горизонталей на доске: ');
  Readln(n);
  Write('Введите количество вертикалей на доске: ');
  Readln(m);
  if (n mod 2) = 0 then Writeln('Черных клеток на доске- ', m * n / 2)
  else Writeln('Черных клеток на доске- ', m * (n-1) / 2 + (m div 2) + (m mod 2))
end.

Тестовое решение:

Введите количество горизонталей на доске: 8
Введите количество вертикалей на доске: 7
Черных клеток на доске- 28


(142k баллов)
0

Program number1;
var n,m,b, result: longint;
begin
readln(n);
readln(m);
If (n mod 2=0) then b:=m*n div 2
Else b:=m*(n-1)div 2+(m div 2)+(m mod 2);
result:=b;
writeln(result);
end.
Тут немного подправлено под условия олимпиадной задачи по информатике.

0

Да, деление заменено на div. Разницы нет, поскольку во всех этих случаях числитель четный и отбрасывания остатка не происходит. Смешные задачи на олимпиадах дают...)))

0

Отвратительно,ничего не понятно

0

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

0

Подскажите, а что значит div?

0

div - это в языке Pascal операция деления нацело с отбрасыванием остатка

0

А m mod 2, соответственно, остаток, да?

0

Да