ВВЕРХ
ВНИЗ
  • Home
  • While
  • While 7 - 14

Найти наименьшее и наибольшее целое число при условии

В следующих заданиях нужно найти наибольшее или наименьшее целое число, для того, чтобы выполнялось некоторое заданное условие.

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:


KSum
102.92896825396825...
1005.18737751763962...
10007.48547086055034...
100009.78760603604435...
10000012.0901461298633...
100000014.392726722865...
1000000016.6953113658573...
10000000018.9978964138526...
100000000021.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.


Яндекс.Метрика