Root /ArchiveAbout
()

Количество отрезков без наложений

Количество отрезков без наложений

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

While1. Даны положительные числа A и B (A > B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти длину незанятой части отрезка A.

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

var
  A, B: real;

begin
  { -- Ввод данных -- }
  writeln('Введите положительные числа A и B (A > B):');  
  write(' A = ');
  readln(A);
  write(' B = ');
  readln(B);
  { -- Основная программа -- }
  while A >= B do { <-- пока A ≥ B }
    A := A - B; { <== уменьшаем число A на B }
  writeln('Длина незанятой части отрезка A: ', A);
  readln
end.

**type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 While2. Даны положительные числа A и B (A > B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти количество отрезков B, размещенных на отрезке A.

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

var
  A, B: real;
  k: word;

begin
  { ******* Ввод данных ******* }
  writeln('Введите положительные числа A и B (A > B):');  
  write(' A = ');
  readln(A);
  write(' B = ');
  readln(B);
  { ******* Основная программа ******** }
  write('Количество отрезков ', B,
    ' размещенных на отрезке ', A, ': ');
  k := 0;  
  while A >= B do { пока A >= B }
  begin
    A := A - B; { <-- уменьшаем число A на B }
    inc(k) { <-- увеличиваем количество k }
  end;
  writeln(k);
  readln
end.

**type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **procedure** Inc(**var** i: integer);: Увеличивает значение переменной i на 1 While3. Даны целые положительные числа N и K. Используя только операции сложения и вычитания, найти частное от деления нацело N на K, а также остаток от этого деления.

Эта задача ничем по сути не отличается от предыдущей While2, только здесь в роли отрезка А выступает число N, а вместо В стоит K. Частное от деления N на K (число i) находим так же – увеличением на 1 каждый раз после уменьшения N на K.

var
  N, K, i: integer;

begin
  { ******* Ввод данных ******* }
  writeln('Введите целые положительные числа N и K:');
  write(' N = ');
  readln(N);
  write(' K = ');
  readln(K);
  { ******* Основная программа ******* }
  writeln('При делении нацело ', N, 
    ' на ', K, ' получим:');
  i := 0; {  <== Частное }
  while N >= K do { <-- Пока N >= K }
  begin
    N := N - K; { <-- уменьшаем число N на K }
    i := i + 1  { <-- увеличиваем частное i }
  end;
  writeln(' частное: ', i);
  writeln(' остаток: ', N);
  readln
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 While4. Дано целое число N (> 0). Если оно является степенью числа 3, то вывести true, если не является — вывести false.

Чтобы число было степенью 3, необходимо делить это число на 3: если при этом частное равно 0 (число делится), то продолжать деление. Очевидно, что этот процесс будет продолжаться до тех пор, пока не получим частное равное 1 (3:3 = 1). Следующее за этим деление даст в остатке уже 1: 1 mod 3 = 1.

const
  d = 3; { <-- Делитель }

var
  N: integer;

begin
  write('N = ');
  readln(N);
  { Следующий цикл будет выполнятся до тех пор,
  пока остаток при делении N на d равен 0: }
  while (N mod d = 0) do { <-- Проверяем делимость на d }
    N := N div d; { <-- Делим нацело N на d }
  { На выходе из цикла, если N - степень d, то после 
  многократного деления N на d будет N = 1: }
  writeln(' ', (N = 1));
  readln
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 A **mod** B - остаток при целочисленном делении А на В A **div** B - целочисленное деление А на В While5. Дано целое число N (> 0), являющееся некоторой степенью числа 2: N = 2K. Найти целое число K — показатель этой степени.

В этой задаче считается, что число уже является степенью 2, нужно только найти показатель этой степени. Естественно, для этого нужно делить число на 2 до тех пор, пока оно не станет равным 1.

var
  N, K: integer;

begin
  write('N = ');
  readln(N);
  k := 0; { <== Начальное значение показателя степени }
  { Поскольку N - степень числа 2, то будем 
  делить N до тех пор, пока не получим 1: }
  while N > 1 do
  begin 
    N := N div 2; { <== Делим на 2 }
    inc(K) { <== Увеличиваем показатель на 1 }
  end;
  writeln('K = ', K);
  readln
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 A **div** B - целочисленное деление А на В **procedure** Inc(**var** i: integer);: Увеличивает значение переменной i на 1 While6. Дано целое число N (> 0). Найти двойной факториал N:

N!! = N·(N−2)·(N−4)·…

(последний сомножитель равен 2, если N — четное, и 1, если N — нечетное). Чтобы избежать целочисленного переполнения, вычислять это произведение с помощью вещественной переменной и вывести его как вещественное число.

Двойной факториал от обычного отличается тем, что в произведении берут участие только числа той четности, что и само число. Например, чтобы посчитать 6!!, необходимо перемножить все четные числа от 2 до 6, поскольку 6 – четное. Для вычисления 9!! нужно перемножить все нечетные числа от 1 до 9, так как 9 – нечетное.

var
  N: word;
  fact2: real;

begin
  write('N = ');
  readln(N); { <-- Вводим целое положительное число }
  writeln;
  write(' ', N, '!! = ');
  fact2 := N; { <-- Начальное значение двойного факториала }
  { Выполняем цикл до тех пор, пока множитель больше 3 - 
  или 5(для нечетного N), или 4(для четного N): }
  while N > 3 do
  begin 
    N := N - 2; { <-- Уменьшаем множитель на 2 }
    fact2 := fact2 * N { <-- Новое значение факториала }
  end;
  writeln(fact2);
  readln
end.

**type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308