М
Молодежь
К
Компьютеры-и-электроника
Д
Дом-и-сад
С
Стиль-и-уход-за-собой
П
Праздники-и-традиции
Т
Транспорт
П
Путешествия
С
Семейная-жизнь
Ф
Философия-и-религия
Б
Без категории
М
Мир-работы
Х
Хобби-и-рукоделие
И
Искусство-и-развлечения
В
Взаимоотношения
З
Здоровье
К
Кулинария-и-гостеприимство
Ф
Финансы-и-бизнес
П
Питомцы-и-животные
О
Образование
О
Образование-и-коммуникации
Dashahaahaa
Dashahaahaa
30.05.2022 15:19 •  Информатика

На вход приведённой ниже программе поступает строка, начинающаяся с символа «>», а затем содержащая 20 цифр 1 , 20 цифр 2 и 20 цифр 3 ,
расположенных в произвольном порядке.
Сколько цифр 1 будет в строке, которая получится после выполнения данной программы?
НАЧАЛО
ПОКА нашлось (>1) ИЛИ нашлось (>2) ИЛИ нашлось (>3)
ЕСЛИ нашлось (>1)
ТО заменить (>1, 222>)
КОНЕЦ ЕСЛИ
ЕСЛИ нашлось (>2)
ТО заменить (>2, >3)
КОНЕЦ ЕСЛИ
ЕСЛИ нашлось (>3)
ТО заменить (>3, 11>)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ

👇
Открыть все ответы
Ответ:
Kunpaw
Kunpaw
30.05.2022
Program Diagonal;
uses Crt;
const n = 5;
Type Mas = array [1..n, 1..n] of integer;
       Vec = array [1..n*n] of integer;
var A: Mas;
     V: Vec;
     i, j , k: integer;
     p : longint;
begin
 ClrScr;
 Randomize;
 p:=1;
 WriteLn('Massiv A:');
 for i:=1 to n do
   begin
      for j:= 1 to n do
         begin
           A[i, j]:= 1+random (9);
           p:=p*A[i,i];
           Write(A[i, j]:4);
         end;
   WriteLn; WriteLn;
   end;
k:=0;
for i:=1 to n do
  for j:=1 to n do
      begin
        if (A[i,j]>p) and (j<i) then
          begin
            k:=k+1;
           V[k]:=A[i, j];
          end;
      end;
  WriteLn('Vector V=');
  for j:=1 to k do
     Write(V[j]:4);

  WriteLn;
  if k=0 then Writeln ('None');
ReadLn;
end.
4,4(66 оценок)
Ответ:
NadushaLove12
NadushaLove12
30.05.2022
Целочисленная арифметика хороша тем, что вычисления в ней точны. Но взамен она требует для представления чисел достаточного большого количества байт и не случайно от переменных типа byte и integer, которые в памяти занимали 1 и 2 байта соответственно, создатели трансляторов с языка Паскаль пришли к четырехбайтному longint, а впоследствии и к восьмибайтному int64. Максимальное число, которое можно представить в longint, равно 2 147 483 647, а в int64 оно равно 9 223 372 036 854 775 807.
Много ли это в применении к нашей задаче?
Нам надо найти и вывести произведение четырехзначных чисел, значение которых не превышает 5000. Допустим, что все они равны 5000 и тогда количество членов в таком произведении может быть оценено при несложного расчета.
\displaystyle 5000^n=9223372036854775807 \to n= \frac{ln(9223372036854775807)}{ln(5000)} ; \\ n\approx 5.127; \ n\in \mathbb N \to n=5
Итак, мы можем получить произведение максимум ПЯТИ таких чисел.
А если использовать longint - вообще всего ДВА числа:
\displaystyle 5000^n=2147483647 \to n= \frac{ln(2147483647)}{ln(5000)} ; \ n\approx 2.523; \\ n\in \mathbb N \to n=2
Но это по верхнему пределу. По нижнему, при значении, равном 1000, эти оценки увеличиваются до 6 и 3 чисел соответственно (достаточно количество разрядов в максимально представимом числе разделить на 3).

Что показывают эти расчеты? Всего лишь НЕПРИГОДНОСТЬ стандартной целочисленной арифметики языка Паскаль (а также других традиционных алгоритмических языков) для решения поставленной задачи в общем случае. Беда еще и в том, что большинство трансляторов строят программу так, что в ней переполнение разрядной сетки (т.е. выход числа за отведенный ему диапазон представления) по умолчанию НЕ КОНТРОЛИРУЕТСЯ. Другими словами, есть риск получить совершенно неверный результат и даже не подозревать об этом!

На может прийти арифметика с плавающей точкой, пригодная для отображения действительно огромных чисел. Но у неё есть свой недостаток - она неточна. В языке Паскаль тип double может оперировать числами до приблизительно 1.8\cdot10^{308}, а вот количество точных цифр при этом составит 15-16. Но даже такая точность выше, чем дает стандартный тип longint.

На основании всего вышеизложенного и с учетом того, что тип int64 реализован далеко не во всех версиях языка Паскаль,  можно принять следующий алгоритм:
1. Получаем искомые числа, генерируя не более, скажем, 50 элементов. Я считаю, что для любого разумного решения задачи такого количества чисел будет достаточно (мы просто не будем допускать, чтобы К превышало 50).
2. Нелепый критерий отбора чисел (квадрат первой цифры меньше квадрата последней цифры числа) заменим разумным. Ведь цифра - суть однозначное число, а если квадрат одного числа меньше квадрата второго, то и сами числа находятся в таком же соотношении, поэтому зачем возводить в квадрат?. Итак, критерием отбора будет "первая цифра меньше последней цифры числа".
3. Находим произведение элементов массива в представлении double.

var
  i,n,k:integer;
  p:double;
begin
  Randomize;
  Write('Введите количество чисел К (1..50): '); Readln(k);
  if (k<1) or (k>50) then Write('Неверное К')
  else begin
    p:=1;
    Writeln('Отобранные случайные числа на интервале [1000;5000]');
    for i:=1 to k do
    begin
      n:=Random(4501)+500; { диапазон [500;5000] }
      if n>=1000 then
        if (n div 1000)<(n mod 10) then
        begin Write(n:5); p:=p*n end;
    end;
    Writeln;
    if p>1 then Writeln('Произведение отобранных чисел равно ',p)
    else Writeln('К сожалению, отобранных чисел нет')
  end 
end.

Тестовые решения:
Введите количество чисел К (1..50): 15
Отобранные случайные числа на интервале [500;5000]
 3208 4925 1279 2528 1637 4979 3536 4416 2116 3655
Произведение отобранных чисел равно 5.02832546192399E+34

Введите количество чисел К (1..50): 3
Отобранные случайные числа на интервале [500;5000]
 3385 1177
Произведение отобранных чисел равно 3984145

Введите количество чисел К (1..50): 1
Отобранные случайные числа на интервале [500;5000]
 3838
Произведение отобранных чисел равно 3838

Введите количество чисел К (1..50): 1
Отобранные случайные числа на интервале [500;5000]

К сожалению, отобранных чисел нет
4,4(63 оценок)
Это интересно:
Новые ответы от MOGZ: Информатика
logo
Вход Регистрация
Что ты хочешь узнать?
Спроси Mozg
Открыть лучший ответ