Program n1; var n,i,k: integer; sum,a: real; begin sum:=0; k:=0; write('n='); readln(n); for i:=1 to n do begin readln(a); if a<0 then begin sum:=sum+a; k:=k+1; end; end; writeln(sum/k); end.
1. 16-битная арифметика со знаком предполагает, что самый левый бит используется для хранения знака. Отрицательные числа хранятся в дополнительном коде. При этом диапазон представления данных составляет -32768..32767. 32760+9 можно записать как 32767+2. Это позволит избежать перевода 32760 в двоичную систему счисления, а 32767 - это 15 двоичных единиц. В знаковом разряде, конечно же, ноль. После сложения в знаковом разряде появляется единица, что означает наличие отрицательного числа в дополнительном коде. Знаковый разряд мы не трогаем, а остальные инвертируем и арифметически прибавляем к полученному числу единицу. Тем самым переходим к прямому коду, который переводим в десятичную систему представления. И результат, конечно, же, будет со знаком минус, т.е. -32767. Вот к чему приводит переполнение разрядной сетки в целочисленной арифметике. Кстати, аппаратно оно не обнаруживается, поскольку криминала нет - просто +1 переходит в самый старший (левый) разряд. "Железо" ведь не знает, сколько разрядов мы отвели под представление чисел и как биты нужно рассматривать! Соответствующая картинка находится в первом вложении.
2. В восьмибитной арифметике все происходит аналогично. 127 представляется знаковым нулем и семью единицами в остальных разрядах, т.е. 01111111₂. Тройка - это 0..011₂ Складываем и получаем 10000010₂. Опять знаковый разряд единичный, инвертируем остальные: 11111101. А теперь прибавляем единицу и получаем 11111110₂. Числу 1111110₂ (знаковый разряд мы не учитываем) соответствует 126₁₀, а с учетом знака окончательно получаем -126.
3. Тут немного больше нужно повозиться. Арифметика снова 16-битная, диапазон представления чисел -32768..32767. Выпишем факториалы в пределах этого диапазона и одно значение вне его. 1!=1, 2!=2, 3!=6, 4!=24, 5"=120, 6!=720, 7!=5040, 8!=40320. Делаем вывод, что максимальное значение факториала можно вычислить для n=7 и n!=5040. Тогда n+1=8 и при его вычислении у нас возникнет арифметическое переполнение. Переведем число 5040 в двоичную систему и умножим его на 8, поскольку 8! = 7! × 8. Поскольку 8 = 2³, то умножение на 8 в двоичной системе равносильно сдвигу числа влево на три разряда. Подробности приведены на рисунке во втором вложении. Мы получим "странный" результат: 8! = -25216.
Переведем длину диагонали в мм. 1"=25.4 мм, тогда длина диагонали d составит 25.4×17 = 431.8 мм. Теперь нужно решить вопрос о соотношении сторон экрана, т.е. отношения ширины экрана к высоте. На старых мониторах использовалось соотношение 4:3, на современных - 16:9 и 16:10. Тут не угадаешь. Примем соотношение 16:9. Пусть высота экрана монитора равна h, тогда его ширина b=(16/9)*h. По теореме Пифагора d² = b²+h². Для выбранного нами случая d² = (16/9)²*h²+h² = h²((16/9)²+1). Решаем полученное уравнение. Если точка имеет размер 0.28мм, то по высоте экрана 211.7 мм таких точек поместится 211.7/0.28 ≈ 756. А по ширине - 756×16/9 ≈ 1344. Получаем разрешение 1344×756. Увы, оно нестандартное, т.е. таких мониторов не выпускают. Смотрим промышленный ряд разрешений и выбираем ближайшее 1366x768. Оно немного больше полученного нами, но это скорее всего вызвано тем, что на самом деле размер точки не 0.28, а 0.2755 мм.
var n,i,k: integer;
sum,a: real;
begin
sum:=0;
k:=0;
write('n=');
readln(n);
for i:=1 to n do
begin
readln(a);
if a<0 then begin
sum:=sum+a;
k:=k+1;
end;
end;
writeln(sum/k);
end.