Предмет: Информатика,
автор: demonoc2012
Напишите программу которая из n случайных чисел находио и выводит четырехзначные числа и их произведения у которых квадрат первой цифры меньше квадрата последней цифры числа .Числа задаются из диапозона от 500 до 5000
Ответы
Автор ответа:
0
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.
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.
Автор ответа:
0
Размещённый в Сервисе ответ должен содержать решение всех проблем содержащихся в вопросе.
...
Ответ на вопрос из области точных предметов, требующий проведения соответствующих расчётов не может состоять только из конечного результата, а должен содержать также упомянутые выше расчёты. Ответ должен содержать объяснение проблемы, указанной Пользователем таким образом, чтобы он мог понять как следует решать данную проблему.
...
Ответ на вопрос из области точных предметов, требующий проведения соответствующих расчётов не может состоять только из конечного результата, а должен содержать также упомянутые выше расчёты. Ответ должен содержать объяснение проблемы, указанной Пользователем таким образом, чтобы он мог понять как следует решать данную проблему.
Автор ответа:
0
Т.е. мы видим: решение ВСЕХ проблем, содержать РАСЧЕТЫ (в нашем случае это текст программы) и ОБЪЯСНЕНИЕ.
Автор ответа:
0
Вот тут и я с Вами согласен, поэтому и решаю тут детям задачки, чтобы форму поддерживать, потому что по работе программирование очень однобокое
Автор ответа:
0
Целочисленная арифметика хороша тем, что вычисления в ней точны. Но взамен она требует для представления чисел достаточного большого количества байт и не случайно от переменных типа 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]
К сожалению, отобранных чисел нет
Много ли это в применении к нашей задаче?
Нам надо найти и вывести произведение четырехзначных чисел, значение которых не превышает 5000. Допустим, что все они равны 5000 и тогда количество членов в таком произведении может быть оценено при помощи несложного расчета.
Итак, мы можем получить произведение максимум ПЯТИ таких чисел.
А если использовать longint - вообще всего ДВА числа:
Но это по верхнему пределу. По нижнему, при значении, равном 1000, эти оценки увеличиваются до 6 и 3 чисел соответственно (достаточно количество разрядов в максимально представимом числе разделить на 3).
Что показывают эти расчеты? Всего лишь НЕПРИГОДНОСТЬ стандартной целочисленной арифметики языка Паскаль (а также других традиционных алгоритмических языков) для решения поставленной задачи в общем случае. Беда еще и в том, что большинство трансляторов строят программу так, что в ней переполнение разрядной сетки (т.е. выход числа за отведенный ему диапазон представления) по умолчанию НЕ КОНТРОЛИРУЕТСЯ. Другими словами, есть риск получить совершенно неверный результат и даже не подозревать об этом!
На помощь может прийти арифметика с плавающей точкой, пригодная для отображения действительно огромных чисел. Но у неё есть свой недостаток - она неточна. В языке Паскаль тип double может оперировать числами до приблизительно
На основании всего вышеизложенного и с учетом того, что тип 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]
К сожалению, отобранных чисел нет
Похожие вопросы
Предмет: Химия,
автор: qcapek
Предмет: Русский язык,
автор: devvka
Предмет: Математика,
автор: medinaduisembek
Предмет: Математика,
автор: JULA2003
Предмет: Математика,
автор: borikos