georgegradoff122
?>

Как это уменьшить? program hello; var a: array of array of array of integer; p: array of integer; i, j, t, cnt, sum, w: integer; m, n, k : integer; begin //writeln ('m='); read (m); //writeln (' n = '); read (n); //writeln ('k='); read (k); setlength (p, m+1); for i: =1 to m do read (p[i]); setlength (a, n+1); for i: =0 to n do setlength (a[i], m+1); for i: =0 to n do for j: =0 to m do setlength (a[i, j], k+1); //for j: =1 to p[i]+1); cnt: =0; for i: =1 to n do for j: =1 to m do for t: =1 to p[j] do begin // writeln ('a[', i, j, t, ']='); read (a[i, j, t]); end; w: =0; for i: =n downto 1 do for j: =1 to m do begin cnt: =cnt+1; sum: =0; for t: =1 to p[j] do //writeln (a[i, j, t]); sum: =sum+(a[i, j, t]); if sum=0 then begin w: =w+1; end; end; writeln (w); cnt: =0; for i: =n downto 1 do for j: =1 to m do begin cnt: =cnt+1; sum: =0; for t: =1 to p[j] do //writeln (a[i, j, t]); sum: =sum+(a[i, j, t]); if sum=0 then begin w: =w+1; writeln (cnt); end; end; end.

Информатика

Ответы

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

Рассмотрим, однако, решение, которое позволит делать подобные задачи без прямого подсчёта. Для этого, прежде всего, переведём всё в степени тройки:

98328316+35+35+35−9−32−32==
9
8
+
3
5
−9 =
3
2
8
+
3
5

3
2
=
3
16
+
3
5

3
2

Как представляется число 3n в троичной системе счисления? Давайте подумаем, как мы переводим из десятичной системы в троичную? Сначала делим на 3, затем частное делим на 3, затем новое частное на 3 и т.п. Что получится в случае деления 3n на 3? Очевидно, что 3n-1. А если его поделить дальше на 3, то получится 3n-2. Если так сделать n раз, то в конце останется 30, то есть. Таким образом, это будет число 100..00, где количество нулей равно n.

То есть, например, 8-ая степени тройки в троичной системе представима в виде 1000000003. А 35 — это 1000003.

Вернёмся теперь к нашей сумме. Давайте сначала в столбик сложим 316 и 35 в троичной системе счисления.

100…000000016100000100…0⏟10100000 1
00

0000000

16
100000 1
00

0

10
100000

Теперь остаётся из этого вычесть 32. Для этого придётся "занять" разряд. Но принцип тут такой же, как и в обычной, десятичной системе счисления, только 0 будут превращаться не в 9, а в 2 (самую большую цифру в троичной системе счисления:

100…0⏞10100000−100100…0⏟10022200 1
00

0

10
100000 −100 1
00

0

10
022200

Таким образом, количество двоек в указанной сумме получилось равным 3.

ответ: 3 двойки в троичной записи.
Vipnikavto58
// PascalABC.NET 3.1, сборка 1230 от 27.04.2016
begin
  var s:=ReadLines('in.txt').ToArray;
  var n:=StrToInt(s[0]);
  var a:=s[1].ToWords.Select(e->StrToInt(e)).ToArray;
  var f:=OpenWrite('out.txt');
  Writeln(f,n,' - (кол-во чисел)');
  foreach var e in a do Write(f,e,' '); Writeln(f);
  Writeln(f,'Среднее значение четных ',
    a.Where(x->x.IsEven).Average);
  Writeln(f,'Среднее значение нечетных ',
    a.Where(x->x.IsOdd).Average);
  f.Close
end.

Файлы in.txt и out.txt находятся во вложении.

Содержимое файла out.txt:
15 - (кол-во чисел)
-22 49 33 47 -10 -1 20 -18 2 21 2 -25 21 -47 -36
Среднее значение четных -8.85714285714286
Среднее значение нечетных 12.25

Ответить на вопрос

Поделитесь своими знаниями, ответьте на вопрос:

Как это уменьшить? program hello; var a: array of array of array of integer; p: array of integer; i, j, t, cnt, sum, w: integer; m, n, k : integer; begin //writeln ('m='); read (m); //writeln (' n = '); read (n); //writeln ('k='); read (k); setlength (p, m+1); for i: =1 to m do read (p[i]); setlength (a, n+1); for i: =0 to n do setlength (a[i], m+1); for i: =0 to n do for j: =0 to m do setlength (a[i, j], k+1); //for j: =1 to p[i]+1); cnt: =0; for i: =1 to n do for j: =1 to m do for t: =1 to p[j] do begin // writeln ('a[', i, j, t, ']='); read (a[i, j, t]); end; w: =0; for i: =n downto 1 do for j: =1 to m do begin cnt: =cnt+1; sum: =0; for t: =1 to p[j] do //writeln (a[i, j, t]); sum: =sum+(a[i, j, t]); if sum=0 then begin w: =w+1; end; end; writeln (w); cnt: =0; for i: =n downto 1 do for j: =1 to m do begin cnt: =cnt+1; sum: =0; for t: =1 to p[j] do //writeln (a[i, j, t]); sum: =sum+(a[i, j, t]); if sum=0 then begin w: =w+1; writeln (cnt); end; end; end.
Ваше имя (никнейм)*
Email*
Комментарий*

Популярные вопросы в разделе

Fedorova_79166180822
serov555zaq5
Vkois56
Шиловский126
kuz-vlad21
nevasoundmsk36
baxirchik
npprang21
Vadim443
veniaminsem
nv6634
Guru-tailor
Maloletkina-marina2
solonataly5
kartyshkinaaa