Найти наименьшее и наибольшее целое число при условии
В следующих заданиях нужно найти наибольшее или наименьшее целое число, для того, чтобы выполнялось некоторое заданное условие.
While7. Дано целое число N (> 0). Найти наименьшее целое положительное число K, квадрат которого превосходит N: K2 > N. Функцию извлечения квадратного корня не использовать.
Начальное значение искомого числа принимаем за 1 (это минимальное целое положительное). Потом увеличиваем его до тех пор, пока его квадрат не превосходит заданное число N. Первое число, нарушающее это условие, и будет искомым числом K.
Код Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | var
N, K: integer;
begin
{ ******* Ввод данных ******* }
writeln('Введите целое положительное число:');
write(' N = ');
readln(N); { <-- Вводим число }
{ ******* Основная программа ******* }
K := 1; { <== Начальное значение искомого числа }
{ Увеличиваем K до тех пор, пока его
квадрат не превосходит N: }
while K * K <= N do
inc(K); { <-- Увеличиваем число на 1 }
writeln;
writeln('Ответ: ', K);
readln
end. |
|
While8. Дано целое число N (> 0). Найти наибольшее целое число K, квадрат которого не превосходит N: K2 ≤ N. Функцию извлечения квадратного корня не использовать.
Задача While8 от предыдущей отличается одним существенным моментом: нужно находить не наименьшее целое, нарушающее условие, а наибольшее целое положительное, при котором условие ещё выполняется. Естественно, что разница между этими двумя числами всего в 1. Поэтому, если K2 ≤ N, то будем увеличивать K на 1 (как и в предыдущей задаче), а на выходе из цикла отнимем 1, так как при этом K условие K2 ≤ N нарушается.
Код Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | var
N, k: integer;
begin
write('N = ');
readln(N);
K := 1; { <-- Начальное значение числа }
{ Выполняем цикл до тех пор, пока
квадрат числа K не превосходит N: }
while K * K <= N do
inc(K); { <-- Увеличиваем число на 1 }
writeln;
writeln('Ответ: ', K - 1);
readln
end. |
|
While9. Дано целое число N (> 1). Найти наименьшее целое число K, при котором выполняется неравенство 3K > N.
Код Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | var
N, k: integer;
begin
write('N = ');
readln(N); { <-- Вводим число N>1 }
K := 1; { <-- Начальное значение искомого числа }
{ Выполняем цикл до тех пор, пока
число 3 * K не превосходит N: }
while 3 * K <= N do
inc(K); { <-- Увеличиваем число на 1 }
writeln;
write('Ответ: ', K);
readln
end. |
|
While10. Дано целое число N (> 1). Найти наибольшее целое число K, при котором выполняется неравенство 3K < N.
Увеличиваем целое K при условии, если 3(K+1) < N. Тогда наибольшее число, при котором 3K < N, будет K.
Код Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | var
N, K: integer;
begin
write('N = ');
readln(N); { <-- Вводим число N > 1 }
K := 1; { <-- Начальное значение }
{ Увеличиваем K до тех пор, пока
число 3(K+1) меньше N: }
while 3 * (K + 1) < N do
inc(K); { <-- Увеличиваем число на 1 }
writeln;
writeln('Ответ: ', K);
readln
end. |
|
Вариант с использованием цикла Repeat:
Код Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | var
N, k: integer;
begin
write('N = ');
readln(N);
K := 1;
{ Выполняем цикл до наступления условия 3K ≥ N: }
repeat
inc(K)
until 3 * K >= N;
writeln;
writeln('Ответ: ', K);
readln
end. |
|
While11. Дано целое число N (> 1). Вывести наименьшее из целых чисел K, для которых сумма 1 + 2 + … + K будет больше или равна N, и саму эту сумму.
Код Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | var
N, K, Sum: word;
begin
writeln('Введите целое положительное число N (> 1):');
readln(N); { <-- Вводим число }
K := 1; { <-- Начальное значение искомого числа }
Sum := 1; { <-- Начальное значение суммы }
{ Выполняем цикл до тех пор, пока Sum меньше N: }
while Sum < N do
begin
inc(K); { <-- Увеличиваем слагаемое на 1 }
Sum := Sum + K { <-- Увеличиваем сумму на K }
end;
writeln(' K = ', K);
writeln(' сумма: ', Sum);
readln
end. |
|
While12. Дано целое число N (> 1). Вывести наибольшее из целых чисел K, для которых сумма 1 + 2 + … + K будет меньше или равна N, и саму эту сумму.
Код Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | var
N, k, Sum: integer;
begin
writeln('Введите целое число N(> 1):');
readln(N);
K := 1; { <-- Начальное значение числа }
Sum := 1; { <-- Начальное значение суммы }
{ Выполняем цикл до тех пор, пока Sum+K+1 не
больше N (K+1 - следующее за K слагаемое): }
while Sum + K + 1 <= N do
begin
inc(K); { <-- Увеличиваем число на 1 }
Sum := Sum + K { <-- Увеличиваем сумму на K }
end;
writeln(' K = ', K);
writeln(' Сумма: ', Sum);
readln
end. |
|
While13. Дано число A (> 1). Вывести наименьшее из целых чисел K, для которых сумма 1 + 1/2 + … + 1/K будет больше A, и саму эту сумму.
Здесь нужно пояснить один момент: как нетрудно догадаться, сумма 1+1/2+1/3+1/4+...1/K с увеличением K растет очень медленно. Для примера посмотрите суммы для некоторых значений K:
K | Sum |
10 | 2.92896825396825... |
100 | 5.18737751763962... |
1000 | 7.48547086055034... |
10000 | 9.78760603604435... |
100000 | 12.0901461298633... |
1000000 | 14.392726722865... |
10000000 | 16.6953113658573... |
100000000 | 18.9978964138526... |
1000000000 | 21.3004815023486... |
Как видим, даже при K=109 (1 миллиард) сумма ряда чуть больше 21, а вычисления у меня на ноутбуке длились 12-13 секунд. Поэтому при вводе K нужно быть осторожным и не вводить большие числа типа 100, 200 и т.д., так как окончания вычислений можете не дождаться ⌛. 
Код Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | var
K: integer;
A, Sum: real;
begin
writeln('Введите число A (> 1):');
write(' A = ');
readln(A); { <-- Вводим число }
K := 1; { <== Начальное значение искомого числа }
Sum := 1; { <== Начальное значение суммы }
{ Выполняем цикл до тех пор, пока Sum не больше A: }
while Sum <= A do
begin
inc(K); { <== Увеличиваем число на 1 }
Sum := Sum + 1 / K { <== Увеличиваем сумму на 1/K }
end;
writeln;
writeln(' число: ', K);
writeln(' сумма: ', Sum);
readln
end. |
|
While14. Дано число A (> 1). Вывести наибольшее из целых чисел K, для которых сумма 1 + 1/2 + … + 1/K будет меньше A, и саму эту сумму.
Код Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | var
K: integer;
A, Sum: real;
begin
write('A = ');
readln(A); { <-- Вводим число }
K := 1; { <== Начальное значение числа }
Sum := 1; { <== Начальное значение суммы }
{ Выполняем цикл до тех пор, пока следующая за Sum
сумма - то есть число Sum+1/(K+1) - будет меньше A: }
while Sum + 1/(K+1) < A do
begin
inc(K); { <== Увеличиваем число на 1 }
Sum := Sum + 1 / K { <== Увеличиваем сумму }
end;
writeln;
writeln(' K = ', K);
writeln(' сумма: ', Sum);
readln
end. |
|