Паскаль, прислать скриншот работы программы. Заполнить массив состоящий из 25 элементов целыми случайными числами от 49 до 99, вывести его на экран, отсортировать его по убыванию и экран.
Целочисленная арифметика хороша тем, что вычисления в ней точны. Но взамен она требует для представления чисел достаточного большого количества байт и не случайно от переменных типа byte и integer, которые в памяти занимали 1 и 2 байта соответственно, создатели трансляторов с языка Паскаль пришли к четырехбайтному longint, а впоследствии и к восьмибайтному int64. Максимальное число, которое можно представить в longint, равно 2 147 483 647, а в int64 оно равно 9 223 372 036 854 775 807. Много ли это в применении к нашей задаче? Нам надо найти и вывести произведение четырехзначных чисел, значение которых не превышает 5000. Допустим, что все они равны 5000 и тогда количество членов в таком произведении может быть оценено при несложного расчета. Итак, мы можем получить произведение максимум ПЯТИ таких чисел. А если использовать longint - вообще всего ДВА числа: Но это по верхнему пределу. По нижнему, при значении, равном 1000, эти оценки увеличиваются до 6 и 3 чисел соответственно (достаточно количество разрядов в максимально представимом числе разделить на 3).
Что показывают эти расчеты? Всего лишь НЕПРИГОДНОСТЬ стандартной целочисленной арифметики языка Паскаль (а также других традиционных алгоритмических языков) для решения поставленной задачи в общем случае. Беда еще и в том, что большинство трансляторов строят программу так, что в ней переполнение разрядной сетки (т.е. выход числа за отведенный ему диапазон представления) по умолчанию НЕ КОНТРОЛИРУЕТСЯ. Другими словами, есть риск получить совершенно неверный результат и даже не подозревать об этом!
На может прийти арифметика с плавающей точкой, пригодная для отображения действительно огромных чисел. Но у неё есть свой недостаток - она неточна. В языке Паскаль тип double может оперировать числами до приблизительно , а вот количество точных цифр при этом составит 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]
Program long; uses Crt; const n=5; type Vec=array [1..n] of integer; var A, B, C: Vec; i,j,k, Col: integer; Pro: longint; a1, a2: integer; begin ClrScr; Randomize; Col:=1; Pro:=1; WriteLn ('Massiv A:'); for i:=1 to n do begin A[i]:=500+random(2000); Write(A[i]:6); if A[i] >1000 then begin B[Col]:=A[i]; Col:=Col+1; end; end; WriteLn; Col:=Col-1; WriteLn; WriteLn ('Massiv B:'); for i:=1 to Col do WriteLn(B[i]); WriteLn; k:=1; for i:=1 to n do begin a2:=B[i] mod 10; a1:=B[i] div 1000; if sqr(a1)<sqr(a2) then begin C[k]:=B[i]; k:=k+1; end; end; for i:=1 to k-1 do Pro:=Pro*C[i]; WriteLn ('Pro=',Pro); ReadLn; end.
картинки
Объяснение:
program Chernovik;
var a:array[1..25] of integer;
i,j,v,m: integer;
begin
writeln('Массив: ');
randomize;
for i:=1 to 25 do
begin
a[i]:=random(51)+49;
write (a[i]:5)
end;
writeln;
writeln('Массив: ');
for i:=1 to 25 do
begin
m:=i;
for j:=i to 25 do
if a[j]>a[m] then m:=j;
v:=a[i];
a[i]:=a[m];
a[m]:=v
end;
for i:=1 to 25 do write (a[i]:5)
end.