Как найти количество итераций

kostyamega8

Мне интересно сколько итераций выполнится во внешнем и внутреннем цикле.

for(int i=0; i < N-1; i++) {
for(int j=0; j < N-i-1; j++) {
}
}


  • Вопрос задан

    более трёх лет назад

  • 5860 просмотров

Определяете целочисленную переменную перед внешним циклом, делаете ей ++ во внутреннем:

int iteration_count = 0;

for (int i = 0; i < N - 1; i++) {
    for (int j = 0; j < N - i - 1; j++) {
        iteration_count++;
    }
}

System.out.println(iteration_count);

Если надо суммарное количество итераций обоих циклов – тогда и во внешнем тоже ++.

Пригласить эксперта


  • Показать ещё
    Загружается…

16 мая 2023, в 11:48

1000 руб./за проект

16 мая 2023, в 11:38

5000 руб./за проект

16 мая 2023, в 11:29

200000 руб./за проект

Минуточку внимания

while((MAP = inputFile.readLine()) != null) {
    System.out.println(MAP);
}

How can we find out the number of iterations performed by the while loop? In this textfile, they can be sometimes 5 lines of data, or 100 lines of data..If they are 5 lines, the while loop probably performed 6 loops. I want that number.

Any suggestions?

moinudin's user avatar

moinudin

133k45 gold badges189 silver badges214 bronze badges

asked Jan 6, 2011 at 0:25

razshan's user avatar

int count = 0; 
while((MAP = inputFile.readLine()) != null) { 
    System.out.println(MAP); 
    count++;
} 
System.out.println(count);

answered Jan 6, 2011 at 0:27

Falmarri's user avatar

FalmarriFalmarri

47.4k41 gold badges151 silver badges191 bronze badges

Set a variable external to the while loop to be a counter, and then increment the counter in the while loop.

answered Jan 6, 2011 at 0:26

Phoenix's user avatar

PhoenixPhoenix

4,4681 gold badge21 silver badges13 bronze badges

0


int iterations = 0;
while((MAP = inputFile.readLine()) != null) {
    System.out.println(MAP);
    iterations++;
}

answered Jan 6, 2011 at 0:28

Hans Hermans's user avatar

int i = 0;
while((MAP = inputFile.readLine()) != null) {
    i++;
    System.out.println(MAP);
    // Some other stuff
}
System.out.println(i);

answered Jan 6, 2011 at 0:28

Dave McClelland's user avatar

Dave McClellandDave McClelland

3,3751 gold badge28 silver badges44 bronze badges

Set a variable to 0 before the while loop and increment the variable inside the while loop. Output the variable after the while loop.

answered Jan 6, 2011 at 0:27

Dallas Clark's user avatar

Dallas ClarkDallas Clark

4,0643 gold badges29 silver badges36 bronze badges

Why do it yourself if you can use java.io.LineNumberReader.getLineNumber() ?

answered Jan 6, 2011 at 1:58

mhaller's user avatar

mhallermhaller

14.1k1 gold badge42 silver badges61 bronze badges

Цикл for являются управляющей конструкцией, позволяя в зависимости от определенных условий выполнять некоторое действие множество раз, рассмотрим на решении задачи для вывода квадратов чисел от 0 до 4:

for (int i = 0; i < 5; i++) {
   Console.WriteLine("Квадрат числа = " + i + "равен = " (i * i));
}

Первая часть объявления цикла — int i = 0 — создает и инициализирует счетчик i. Счетчик необязательно должен представлять тип int. Это может быть и другой числовой тип, например, double. И необязательно будет имя этой переменной i, может быть любое понятное имя. Перед выполнением цикла счетчик будет иметь значение 0. В данном случае это то же самое, что и объявление переменной.

Вторая часть — условие, при котором будет выполняться цикл. Пока условное выражение возвращает true, будет выполняться цикл. В данном случае цикл будет выполняться, пока счетчик i меньше 5.

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

В итоге блок цикла сработает 5 раз, пока значение i не станет равным 4. И каждый раз это значение будет увеличиваться на 1.

Добавлю переменная i, будет видна только в том цикле, где была инициализирована.

Нам необязательно указывать все определения при объявлении цикла. Например, мы можем написать так:

int i = 0;
for (;i<5;) {
   Console.WriteLine("Квадрат числа = " + (i++) + "равен = " (i * i));
}

Формально определение цикла осталось тем же, только теперь блоки инициализации и изменения переменной цикла в определении у нас пустые: for (; i < 5 ;). Оставшееся условие позволяет выйти из цикла, если в теле цикла переменная цикла изменяет значение.

Этот пример по сути эквивалентен первому примеру: у нас также есть счетчик, только создан он вне цикла. У нас есть условие выполнения цикла. И есть приращение счетчика уже в самом блоке for.

Добавлю следующее:

  • если произошла инициализация переменной перед циклом, то после цикла можно воспользоваться значением этой объявленной переменной;
  • очередное прохождение цикла называется итерацией;
  • начальное и конченое значение переменной цикла может быть произвольной, главное чтобы количество нужных итераций цикла сохранялось;
  • чтобы посчитать количество итераций цикла нужно посчитать два значения:

max — максимальное значение переменной цикла, при котором мы зашли в цикл

min — минимальное значение переменной цикла, при котором мы зашли в цикл

количество итераций вычисляется следующим выражением: max — min + 1, где i меньше равно max.

Loop_1

В каком порядке работает цикл for?

1. условие входа
2. инициализация счетчика
3. изменения переменной цикла

Решение:

1. Инициализация счетчика, 2. условие выхода, 3. изменение переменной цикла

Loop_2

Без использования среды программирования, сколько итераций цикла в данной программе?

for (int i = -25; i <= 25; i++) {
}

Решение:

Решаем прибегая формуле max-min+1: 25 — -25 + 1 = 51

Loop_3

Без использования среды программирования, определите, сколько раз и как сработает следующая программа?

for (int i = 5; i < 20; i++) {
   Console.WriteLine("Hello World!");
}

Решение:

От 5 до 19 включительно пятнадцать чисел, следовательно цикл имеет 15 итераций и 15 раз выведет в консоль фразу «Hello World!», каждый раз на новой строке.

Loop_4

Без использования среды программирования, сопоставьте циклы, которые выполняют одинаковое количество итераций:

1. for (int i = -2; i < 9; i++)              a. for (int x = 8; x > 0; x--)
2. for (int b = 0; b < 17; b++)	             b. for (int j = -1; j <= 9; j++)
3. for (int y = 18; y > -1; y--)             c. for (int k = 5; k >= -11; k--)
4. for (int h = -10; h < -2; h++)            d. for (int i = 19; i <= 37; i++)

Решение: 1b, 2c, 3d, 4a

Loop_5

Напишите программу, которая выводит «Hello World!» 99 раз, каждый раз на новой строке.

Пример использования: 
Выходные данные  1: Hello World!
Выходные данные  2: Hello World!
Выходные данные...: ...
Выходные данные 99: Hello World!

Решение:

Организуем цикл for с инициализацией переменной цикла i целого типа равной 0, с условием выхода когда переменная i будет равна 99, и каждую итерацию цикла будем инкрементировать переменную i на единицу.

//Листинг решения задачи loop_5:
using System;
namespace Serg40in {
 class Program {
  static void Main(string[] args) {
	for (int i = 0; i < 99; i++) 
	    Console.WriteLine("Hello World!");
	Console.ReadKey(); 
  }
 }
}

Или можем инкрементировать в теле цикла, а блок изменения в заголовке цикла оставить пустым:

for (int i = 0; i < 99; ) {
	  Console.WriteLine("Hello World!");
	  i++;
}

Или вообще не использовать целый тип для счетчика, а пофантазировать, и взять тип double:

for (double dbl = 0; dbl < 0.99; dbl+=0.01) {
	  Console.WriteLine("Hello World!");
}

Loop_6

Напишите программу, которая выводит только четные числа от 2 до 200.

Пример использования: 
Выходные данные 1: 2 4 6 8 … 200

Решение:

Разберем задачу, в котором надо вывести четные числа от 1 до 200. Воспользуемся циклом for, в котором переменная цикла будет принимать все значения от 1 до 100. Каждое такое значение будем проверять на четность и выводить на консоль.

//Листинг решения задачи loop_6:
using System;
namespace Serg40in {
 class Program {
  static void Main(string[] args) {
	for (int i = 1; i <= 200; i++) 
	   if(i % 2 == 0) Console.Write(i + " ");
	Console.ReadKey(); 
  }
 }
}

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

for (int i = 2; i <= 200; i+=2) 
   Console.Write(i);

Loop_7

Напишите программу, которая выводит все четные числа на заданном отрезке.

Пример использования: 
Выходные данные 1: Введите построчно начало и конец цифрового отрезка
Входные данные  1: (2) (8)
Выходные данные 1: 2 4 6 8

Выходные данные 2: Введите построчно начало и конец цифрового отрезка
Входные данные  2: (12) (3) 
Выходные данные 2: 4 6 8 10 12

Решение:

Обратим внимание на пример использования, где во вторых входных данных введен диапазон не от малого к большому, а большого к малому. После получения числовых границ, назначим стартовое и финишное значения путем сравнения или использования метода Max и Min. В теле цикла для вывода чисел будем использовать сравнение на остаток от деления на 2.

//Листинг решения задачи loop_7:
using System;
namespace Serg40in {
 class Program {
  static void Main(string[] args) {
	Console.WriteLine("Введите построчно начало и конец цифрового отрезка");
	int a = int.Parse(Console.ReadLine());
	int b = int.Parse(Console.ReadLine());
	int start= Math.Min(a,b);
	int end = Math.Max(a,b);
	for (int i = start; i <= end; i++) 
	    if (i % 2 == 0) Console.Write(i + " ");
	Console.ReadKey(); 
  }
 }
}

Или без условия, где получим начальное значение уже в четном состоянии, и переменную цикла будем увеличивать на 2.

Console.WriteLine("Введите построчно начало и конец цифрового отрезка");
int a = int.Parse(Console.ReadLine());
int b = int.Parse(Console.ReadLine());
int start = Math.Min(a,b);
int end = Math.Max(a,b);
for (int i = start % 2 + start; i <= end; i+=2) 
   Console.Write(i + " ");

Loop_8

По данному натуральному числу x, выведите все его делители.

Пример использования: 
Выходные данные 1: Введите натуральное число
Входные данные  1: 8
Выходные данные 1: 1 2 4 8

Решение:

Используем цикл for, для прохождения по числовому диапазону от 1 до квадратного корня введенного числа, в теле цикла проверяем на делимость без остатка введенного числа на переменную цикла. Переменную циклу инрементируем с каждой итерацией.

//Листинг решения задачи loop_8:
using System;
namespace Serg40in {
 class Program {
  static void Main(string[] args) {
	int x = int.Parse(Console.ReadLine());
	for (int i = 1; i * i <= x; i++) 
	    if (x % i == 0) Console.Write(i + " ");
	Console.ReadKey(); 
  }
 }
}

Loop_9

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

Пример использования: 
Выходные данные 1: Введите построчно начало и конец цифрового отрезка
Входные данные  1: (2) (9)
Выходные данные 1: 7 5 3

Решение:

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

//Листинг решения задачи loop_9:
using System;
namespace Serg40in {
 class Program {
  static void Main (string [] args) {
	Console.WriteLine("Введите построчно начало и конец цифрового отрезка");
	int a = int.Parse(Console.ReadLine());
	int b = int.Parse(Console.ReadLine());
	int start = Math.Max(a,b);
	int end = Math.Min(a,b);
	for (int i = start; i >= end; i--) 
	   if (i % 2 == 1) Console.Write(i + " ");
	Console.ReadKey(); 
  }
 }
}

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

Console.WriteLine("Введите построчно начало и конец цифрового отрезка");
int a = int.Parse(Console.ReadLine());
int b = int.Parse(Console.ReadLine());
int start = Math.Max(a,b);
int end = Math.Min(a,b);
start = start / 2 * 2 + (start % 2 == 1 ? 1: -1);
for (int i = start; i >= end; i-= 2) 
   Console.Write(i + " ");

Loop_10

По данному числу n найдите те числа, где сумма цифр квадрата числа больше n. Гарантируется, что n меньше 1000.

Пример использования: 
Выходные данные 1: Введите целое число
Входные данные  1: 8
Выходные данные 1: 3 6 7

Решение:

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

//Листинг решения задачи loop_10:
using System;
namespace Serg40in {
 class Program {
  static void Main (string [] args) {
	Console.WriteLine("Введите целое число ");
	int n = int.Parse(Console.ReadLine());
	int sumDigit, square;
	for (int i = 1; i < = n; i++) {
	   square = i * i;
	   sumDigit = square / 100 + square / 10 % 10 + square % 10;
	   if (sumDigit > n) 
              Console.Write(i + " ");
	}
	Console.ReadKey(); 
  }
 }
}

Loop_11

Найти сумму введенных пользователем десяти чисел.

Пример использования: 
Выходные данные 1: 1. Введите число 
Входные данные  1: 9
Выходные данные 1: 2. Введите число 
Входные данные  1: -12
…

Выходные данные 1: 10. Введите число 
Входные данные  1: 0.523
Выходные данные 1: Сумма введенных чисел = 9

Решение:

В цикле, который выполняется 10 раз, будем вводить число и суммировать в переменную(сумматор). Главное учесть, что переменную суммы нужно объявить перед циклом.

//Листинг решения задачи loop_11:
using System;
namespace Serg40in {
 class Program     {
  static void Main(string[] args) {
	double sum=0, number;
	for (int i = 1; i < 11; i++)  {
	   Console.Write($"{i}. Введите число ");
	   number = double.Parse(Console.ReadLine());
	   sum += number;
	}
	Console.Write("Сумма введенных чисел = " + sum);
	Console.ReadKey(); 
  }
 }
}

Или сокращаем написанное, если не будет никаких манипуляций с введенной переменной:

double sum = 0;
for (int i = 1; i < 11; i++) {
   Console.Write($"{i}. Введите число ");
   sum += double.Parse(Console.ReadLine());
}
Console.WriteLine("Сумма введенных чисел = " + sum);
Console.ReadKey(); 

Loop_12

Без использования среды программирования, определите, какую задачу решает следующий код?

int sum = 0;
for (int i = 19; i > 1; i--) 
   sum += i;
Console.WriteLine(sum);

Решение:

Цикл начинается с 19 и уменьшается на единицу по будет больше одного, следовательно программа находит сумму чисел от 2 до 19.

Loop_13

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

int count = 0, int.Parse(Console.ReadLine());  
for (int i = 1; i <= n; i++) 
   if (i % 2 == 0 && i % 5 != 0) 
      count++;
Console.WriteLine(count);

Решение:

Находит количество четных чисел от 1 до n не кратных 5.

Loop_14

Выведите количество натуральных делителей целого числа x, исключая 1 и само число.

Пример использования: 
Выходные данные 1: Введите целое число 
Входные данные  1: 9
Выходные данные 1: Количество делителей, исключая 1 и 9 = 1

Решение:

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

//Листинг решения задачи loop_14:
using System;
namespace Serg40in {
 class Program     {
  static void Main(string[] args) {
	Console.Write("Введите целое число ");
	int cnt = 0, divisible = int.Parse(Console.ReadLine());
	for (int i = 2; i < divisible; i++)  {
	   if (divisible % i == 0) 
              cnt++;
	}
	Console.WriteLine($"Количество делителей, исключая {1} и {divisible} = {cnt}");
	Console.ReadKey(); 
  }
 }
}

Или пишем сокращенный код:

Console.Write("Введите целое число ");
int cnt = 0, divisible = int.Parse(Console.ReadLine());
for (int i = 2; i < divisible; i++) 
   cnt += divisible % i == 0 ? 1 : 0;
Console.WriteLine($"Количество делителей, исключая {1} и {divisible} = {cnt}");
Console.WriteLine(cnt);

Loop_15

Пользователь ввел n чисел. Найти сумму и количество отрицательных четных чисел.

Пример использования: 
Выходные данные 1: Введите целое число — количество нужных чисел
Входные данные  1: 3
Выходные данные 1: 1. Введите число 
Входные данные  1: 17
Выходные данные 1: 2. Введите число 
Входные данные  1: -4
Выходные данные 1: 3. Введите число 
Входные данные  1: -18
Выходные данные 1: Сумма отрицательных четных чисел = -22
Выходные данные 1: Количество отрицательных четных чисел = 2

Решение:

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

//Листинг решения задачи loop_15:
using System;
namespace Serg40in {
 class Program {
  static void Main(string[] args) {
	Console.Write("Введите целое число — количество нужных чисел ");
	int n = Convert.ToInt32(Console.ReadLine());
	int sum = 0, cnt = 0, input;
	for (int i = 1; i <= n; i++){
	   Console.Write($"{i}. Введите целое число ");
	   input = int.Parse(Console.ReadLine());
	   if (input % 2 == 0 && input < 0 ) {
	      sum += input; 
	      cnt++;
	   }
	}
	Console.WriteLine("Сумма отрицательных четных чисел = " + sum);
	Console.WriteLine("Количество отрицательных четных чисел = " + cnt);
	Console.ReadKey();
  }
 }
}

Loop_16

Пользователь ввел n чисел. Найдите сумму чисел, которые больше 2, но меньше введенного n.

Пример использования: 
Выходные данные 1: Введите целое число — количество нужных чисел
Входные данные  1: 4
Выходные данные 1: 1. Введите число 
Входные данные  1: 2
Выходные данные 1: 2. Введите число 
Входные данные  1: 3
Выходные данные 1: 3. Введите число 
Входные данные  1: 3
Выходные данные 1: 4. Введите число 
Входные данные  1: 4
Выходные данные 1: Сумма чисел = 6

Решение:

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

//Листинг решения задачи loop_16:
using System;
namespace Serg40in {
 class Program     {
  static void Main(string[] args) {
	Console.Write("Введите целое число — количество нужных чисел ");
	int n = Convert.ToInt32(Console.ReadLine());
	double sum = 0, input;
	for (int i = 1; i <= n; i++){
	   Console.Write($"{i}. Введите целое число ");
	   input = double.Parse(Console.ReadLine());
	   if (input >  2 && input < n ) sum+=input; 
	}
	Console.WriteLine("Сумма чисел = " + sum);
	Console.ReadKey();
  }
 }
}

Loop_17

По данным n числам, определите количество чисел, оканчивающиеся на 0.

Пример использования: 
Выходные данные 1: Введите целое число — количество нужных чисел
Входные данные  1: 2
Выходные данные 1: 1. Введите число 
Входные данные  1: 50
Выходные данные 1: 2. Введите число 
Входные данные  1: 29
Выходные данные 1: Количество чисел оканчивающиеся на ноль = 1

Решение:

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

//Листинг решения задачи loop_17:
using System;
namespace Serg40in {
 class Program {
  static void Main (string [] args) {
	Console.Write("Введите целое число — количество нужных чисел ");
	int n = int.Parse(Console.ReadLine());
	int cnt = 0, input;
	for (int i = 1; i <= n; i++){
	   Console.Write($"{i}. Введите целое число ");
	   input = int.Parse(Console.ReadLine());
	   if (input % 10==0) cnt++;
       }
	Console.WriteLine("Количество чисел оканчивающиеся на  " + cnt);
	Console.ReadKey();
  }
 }
}

Или сократим, избавимся от лишней переменной:

Console.Write("Введите целое число — количество нужных чисел ");
int cnt=0, n=int.Parse(Console.ReadLine());
for (int i=1;i<=n;i++) {
   Console.Write($"{i}. Введите целое число ");
   cnt +=(int.Parse(Console.ReadLine()) % 10 == 0 ? 1: 0);
}
Console.WriteLine("Количество чисел оканчивающиеся на  " + cnt);

Loop_18

По данным n числам, определить наличие нуля среди них.

Пример использования: 
Выходные данные 1: Введите целое число — количество нужных чисел
Входные данные  1: 2
Выходные данные 1: 1. Введите число 
Входные данные  1: 0
Выходные данные 1: 2. Введите число 
Входные данные  1: 19
Выходные данные 1: В введенных числах есть ноль

Выходные данные 2: Введите целое число — количество нужных чисел
Входные данные  2: 2
Выходные данные 2: 1. Введите число 
Входные данные  2: 17
Выходные данные 2: 2. Введите число 
Входные данные  2: 18
Выходные данные 2: В введенных числах ноль отсутствует

Решение:

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

//Листинг решения задачи loop_18:
using System;
namespace Serg40in {
 class Program {
  static void Main (string [] args) {
	Console.Write("Введите целое число — количество нужных чисел ");
	int n = int.Parse(Console.ReadLine());
	int cntNull = 0;
	for (int i = 1; i <= n; i++) {
	   Console.Write($"{i}. Введите целое число ");
	   cntNull += double.Parse(Console.ReadLine()) == 0 ? 1: 0;
	}
	Console.WriteLine(cntNull > 0 ? "В введенных числах есть ноль" : "В введенных числах ноль отсутствует");
	Console.ReadKey(); 
  }
 }
}

Loop_19

Вывести факториал числа n, где гарантируется, что n не больше 10.

Пример использования: 
Выходные данные 1: Введите целое число для поиска факториала
Входные данные  1: 5
Выходные данные 1: Факториал 5! = 120 

Решение:

Вспомним, что такое факториал: факториалом целого числа n называется произведение всех целых чисел от 1 до n. Обозначается как n! и равняется: n! = 1*2*3*n, где например факториал пяти будет равен 5!=1*2*3*4*5=120. Следовательно, организуем цикл for от 1 до n, и каждое новое значение будем умножать на значение переменной, изначально равной единице, так как это будет произведение и если один из множителей будет равен нулю, то и произведение будет равно нулю. В задание ограничено значение для n, поэтому проверим корректен ли ввод.

//Листинг решения задачи loop_19:
using System;
namespace Serg40in {
 class Program {
  static void Main (string [] args) {
	Console.Write("Введите целое число от 1 до 10: ");
	int n = int.Parse(Console.ReadLine());
	if (n > 0 && n < 11) {
	   int factorial = 1;
	   for (int i=1; i<=n; i++) factorial *= i;
	   Console.WriteLine($"Факториал {n}! = {factorial}");
	} else Console.Write("Введенное число вне диапазона 1-10");
	Console.ReadKey(); 
   }
 }
}

Или можем сократить, очистив тело цикла от инструкций:

Console.Write("Введите целое число от 1 до 10: ");
int n = int.Parse(Console.ReadLine());
if (n > 0 && n < 11) {
   int factorial = 1; 
   for (int i = 1; i <= n; factorial *= i, i++);
      Console.WriteLine($"Факториал {n}! = {factorial}");
} else Console.Write("Введенное число вне диапазона 1-10");

Рассмотрим ограничение в условии задачи, где указано то, что n будет не больше 10. В нашем случае происходит умножение, где на начальном этапе множители маленькие, соответственно произведение получается не большое, но если вычислить факториал 12 то получиться большое число = 479 001 600, и если его еще умножить на 13, чтобы получить факториал 13 — произойдет переполнение для максимального значения в типе int, где int.MaxValue = 2.147.483.647. Следовательно, значение 13! будет не корректно. Для того чтобы такая ошибка не возникла, то используем для вычислений произведений тип long, но опять же корректный результат будет если значение произведения не будет превышать огромного числа 9.223.372.036.854.775.807, соответственно 20! посчитается корректно, но 21! уже будет с переполнением.

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

Loop_20

По данному числу n!=0, найдите произведение четных чисел от 1 до n, или от n до 1, если n < 0.

Пример использования: 
Выходные данные 1: Введите целое число не равное нулю
Входные данные  1: 8
Выходные данные 1: Произведения четных чисел от 1 до 8 = 384


Выходные данные 2: Введите целое число не равное нулю
Входные данные  2: -12
Выходные данные 2: Произведения четных чисел от 1 до 8 = 120 

Выходные данные 3: Введите целое число не равное нулю
Входные данные  3: 0
Выходные данные 3: Ошибка входных данных: введен 0

Решение:

Получаем число от пользователя и анализируем его. Если ввели положительное число, то стартовое значение для цикла будет равно единице, а конечное n. Если же ввели отрицательное число, то стартовое значение для цикла будет равно n, а конечное будет равно -2 — самому первому четному отрицательному значению, так как если мы будем ставить в конечное значение цикла единицу, то при прохождении от отрицательных чисел к положительным будет множитель 0, и следовательно произведение будет тоже равно нулю.

//Листинг решения задачи loop_20:
using System;
namespace Serg40in {
 class Program     {
  static void Main(string[] args) {
	Console.Write("Введите целое число неравное нулю: ");
	int n = int.Parse(Console.ReadLine());
	if (n != 0) {
	   long compositionEven=1;
	   int startLoop = n > 0 ? 1: n;
	   int endLoop = n > 0 ? n: -2;
	   for (int i = startLoop; i <= endLoop; i++) 
	      if (i % 2 == 0) compositionEven *= i;  
	   Console.WriteLine($"Произведения четных чисел от 1 до {n} = {compositionEven}");
	} else Console.WriteLine("Ошибка входных данных: введен 0");
	Console.ReadKey();
  }
 }
}

Loop_21

Написать программу для нахождения a в степени n, введенных построчно с клавиатуры. Не использовать методы класса Math.

Пример использования: 
Выходные данные 1: Введите целое число – основание степени:
Входные данные  1: 2
Выходные данные 1: Введите целое число — показатель степени
Входные данные  1: 8
Выходные данные 1: Число 2^8 = 256

Решение:

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

//Листинг решения задачи loop_21:
using System;
namespace Serg40in {
 class Program     {
  static void Main(string[] args) {
	Console.Write("Введите целое число - основание степени: ");
	int degreeBase = int.Parse(Console.ReadLine());
	Console.Write("Введите целое число - показатель степени: ");
	int degree = int.Parse(Console.ReadLine());
	long numberInPower=1;

	for (int i = 1; i <= degree; i++) 
	   numberInPower *= degreeBase;    
	Console.WriteLine($"Число {degreeBase}^{degree} = {numberInPower}");
	Console.ReadKey();
  }
 }
}

Loop_22

По данным двум целым числа a и b, вычислите произведение чисел на отрезке от a до b. Не гарантируется, что a обязательно меньше b. Сделать форматированный вывод.

Пример использования: 
Выходные данные 1: Введите построчно два целых числа (границы числового отрезка)
Входные данные  1: (2) (7)
Выходные данные 1: Произведение чисел 2*3*4*5*6*7 = 120 

Выходные данные 2: Введите построчно два целых числа (границы числового отрезка)
Входные данные  2: (5) (10)
Выходные данные 2: Произведение чисел 5*6*7*8*9*10 = 12

Решение:

В условии указано, что нет гарантии того, что пользователь введет сначала меньшее число, а потом большее. Поэтому мы должны определить начальное значение и конечное значение для цикла for, а потом вычислять произведение чисел. И обязательно будем использовать форматированный вывод.

//Листинг решения задачи loop_22:
using System;
namespace Serg40in {
 class Program {
  static void Main (string [] args) {
	Console.WriteLine("Введите построчно два целых числа (границы числового отрезка)");
	int a = int.Parse(Console.ReadLine());
	int b = int.Parse(Console.ReadLine());
	long composition = 1; 
	Console.Write("Произведение чисел ");
	for (int i = Math.Min(a,b); i <= Math.Max(a,b); i++) {
	   composition *= i;
	   Console.Write(i != Math.Max(a,b) ? i + "*": i+ "=");  
	}
	Console.WriteLine(composition);
	Console.ReadKey(); 
  }
 }
}

Loop_23*

По данным построчно двум целым числам a и b, вычислите произведение чисел на отрезке от a до b, оканчивающихся на 7. Не гарантируется, что a будет меньше b. Сделать форматированный вывод.

Пример использования: 
Выходные данные 1: Введите построчно два целых числа (границы числового отрезка)
Входные данные  1: (2) (17)
Выходные данные 1: Произведение чисел 7*17 = 119

Выходные данные 2: Введите построчно два целых числа (границы числового отрезка)
Входные данные  2: (22) (19)
Выходные данные 2: На этом числовом отрезке нет чисел оканчивающихся на 7

Выходные данные 3: Введите построчно два целых числа (границы числового отрезка)
Входные данные  3: (20) (36)
Выходные данные 3: На этом числовом отрезке только одно число оканчивающихся на 7 это 27

Решение:

Решать задачу будет исходя требованиям в примере использования, где будет выводиться ответ, не только произведение чисел оканчивающихся на 7, но и при одном числе с семеркой на конце, и вообще если таких чисел нет. Поэтому, сначала определим, если ли вообще на введенном отрезке числа оканчивающиеся на семь. Если количество чисел больше одного, то будем опять будем просматривать числовой отрезок, и с каждым найденным числом добавлять форматированный вывод. Если же количество чисел, на первом этапе, было всего одно, то выведем, что только найдено одно число. Иначе, если на первом этапе нужных чисел не найдено, то выведем в консоль сообщение о не найденных числах.

Для корректного значения используем тип long для хранения значения произведения. На проверку программе задаем малые числа.

//Листинг решения задачи loop_23:
using System;
namespace Serg40in {
 class Program {
  static void Main (string [] args) {
	Console.WriteLine("Введите построчно два целых числа (границы числового отрезка)");
	int a = int.Parse(Console.ReadLine());
	int b = int.Parse(Console.ReadLine());
	long composition = 1; 
	int cntSeven=0, firstSeven=0;
	for (int i = Math.Min(a,b); i <= Math.Max(a,b); i++) {
	   if (i % 10 == 7)  {
	      cntSeven++;
	      if (cntSeven==1) firstSeven =i;
	   }
	}
	if (cntSeven>1) {
          Console.Write("Произведение чисел ");
	   for (int i = Math.Min(a,b), cntSevenInFor=0; i <= Math.Max(a,b); i++) {
	      if (i % 10 == 7) {
	         composition *= i;
	         cntSevenInFor++;
	         Console.Write(cntSeven != cntSevenInFor ? i + "*": i+ "=");  
	      }
	   }
	   Console.WriteLine(composition);
       } else if (cntSeven==1) 
                 Console.Write("На этом числовом отрезке только одно число оканчивающихся на 7 это " + firstSeven);
              else 
                 Console.Write("На этом числовом отрезке нет чисел оканчивающихся на 7");
       Console.ReadKey(); 
  }
 }
}

Mixail



Мудрец

(12922),
закрыт



6 лет назад

к примеру for ($i = 0;$i<=999999;$i++){
$array = str_split($i);

$summ_1 = $array[0]+$array[1]+$array[2];
$summ_2 = $array[3]+$array[4]+$array[5];

if(count($array) == ‘6’ && $summ_1 == $summ_2){
в этом месте
}
}

Лучший ответ

Miku Hatsune

Мудрец

(11124)


6 лет назад

Создай переменную за пределами цикла и инкрементируй ее в этой области.

Остальные ответы

Metotron

Искусственный Интеллект

(114384)


6 лет назад

$i — счётчик итераций. Но у тебя она от нуля, значит $i + 1

Mixail Мудрец (12922)

6 лет назад

но мне нужно внутри условия if это посчитать . $i + 1 посчитает все итерации а в условии их будет меньше

Mixail Мудрец (12922)

6 лет назад

А все доперло, переменную за пределами цикла нужно создать

Metotron
Искусственный Интеллект
(114384)
Зачем? У тебя в цикле есть $i, это и есть счётчик. if ($i == 10) чем плохо?

Похожие вопросы

Содержание:

  • Решение задания 6 ЕГЭ по информатике для 2021
  • Решения подобных заданий прошлых лет
    • Определить, какое число пропущено
    • Простые задания с двумя линейными непересекающимися функциями
    • Сумма или разность двух линейных функций (while s – n или while s + n)
    • Поиск наименьшего/наибольшего целого введенного числа d
    • Усложненные задания с двумя линейными функциями
    • Арифметическая и геометрическая прогрессия
    • Программирование: массивы и матрицы

Решение задания 6 ЕГЭ по информатике для 2021

6-е задание: «Программирование: основные конструкции»

Уровень сложности

— базовый,

Требуется использование специализированного программного обеспечения

— нет,

Максимальный балл

— 1,

Примерное время выполнения

— 4 минуты.

  
Проверяемые элементы содержания: Знание основных конструкций языка программирования, понятия переменной, оператора присваивания

До ЕГЭ 2021 года — это было задание № 8 и задание № 19 ЕГЭ

  
Задание демонстрационного варианта 2022 года ФИПИ
Плейлист видеоразборов задания на YouTube:


6_1 new: Определите, при каком наименьшем введённом значении переменной s программа выведет число 256 :

Паскаль:

1
2
3
4
5
6
7
8
9
10
11
var k,n,p,l,s,x:integer;
var s, n: integer;
begin
  readln (s);
  n := 1;
  while s <=45 do begin
    s := s + 4;
    n := n * 2
  end;
  writeln(n)
end.
Бейсик:

Python:

s = int(input())
n = 1
while s <= 45:
  s = s + 4
  n = n * 2
print( n )
С++:

#include <iostream>
using namespace std;
int main() {
int s,  n = 1;
cin >> s;
while( s <= 45 ) {
  s = s + 4;
  n = n * 2;
  }
cout << n;
}

Типовые задания для тренировки

Ответ: 14
Видеорешение подобного 6 задания на Python:
📹 Видео
📹 Видеорешение на RuTube здесь

Показать решение:

    ✎ Способ 1 (программный):
    Pascalabc.net:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    begin
      var s0 := 1;
      while true do // внешний цикл, бесконечный
      begin
        var s := s0;
        // --- код из условия задания --- //
        var n := 1;
        while s <= 45 do // внутренний цикл из задания
        begin
          s := s + 4;
          n := n * 2;
        end;
        // --- конец кода из условия задания --- //
        if n = 256 then // если найдено, то выводим соответствующее s
        begin 
            print(s0); 
            break;  // выход из бесконечного цикла 
        end;
        s0 := s0 + 1; // 
      end;
    end.

    Пояснение:

  • Поскольку в цикле s увеличивается, а по условию задания следует найти наименьшее значение s, то можно начать с s=1, постоянно увеличивая значение s на единицу во внешнем цикле.
  • Важно для внешнего цикла использовать другую переменную, т.к. во внутреннем цикле переменная s меняется, а нам следует каждый шаг внешнего цикла сохранить предыдущее значение s, увеличив его всего на 1. Используем переменную S1 для этих целей.
  • Бейсик:

    Python:

    s1 = 1
    while True:  # внешний цикл, бесконечный
        s = s1
        # --- код из условия задания --- 
        n = 1
        while s <= 45:
            s = s + 4
            n = n * 2
        # --- конец кода из условия задания --- 
        if n == 256:
            print(s1)
            break
        s1 += 1
    С++:

6_2 new: Определите, при каком наибольшем введённом значении переменной s программа выведет число 96:

Паскаль:

1
2
3
4
5
6
7
8
9
10
var s, n: integer;
begin
  readln (s);
  n := 3;
  while s <= 51 do begin
    s := s + 7;
    n := n * 2
  end;
  writeln(n)
end.
Бейсик:

Python:

s = int(input())
n = 3
while s <= 51:
  s = s + 7
  n = n * 2
print( n )
С++:

#include <iostream>
using namespace std;
int main() {
int s,  n = 3;
cin >> s;
while( s <= 51 ) {
  s = s + 7;
  n = n * 2;
  }
cout << n;
}

Типовые задания для тренировки

Ответ: 23
📹 Видео
📹 Видеорешение на RuTube здесь

Показать решение:

✎ Способ 1 (программный):

Pascalabc.net:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
begin
  var s1 := 50;
  while true do // внешний цикл, бесконечный
  begin
    var s := s1;
    // --- код из условия задания --- //
    var n := 3;
    while s <= 51 do // внутренний цикл из задания
    begin
      s := s + 7;
      n := n * 2;
    end;
    // --- конец кода из условия задания --- //
    if n = 96 then // если найдено, то выводим соответствующее s
    begin 
        print(s1); 
        break;  // выход из бесконечного цикла 
    end;
    s1 := s1 - 1; // 
  end;
end.

Пояснение:

  • Поскольку в цикле s увеличивается, и цикл работает пока s<=50, а по условию следует найти наибольшее значение s, то можно начать с s = 50, постоянно уменьшая значение s на единицу во внешнем цикле.
  • Важно для внешнего цикла использовать другую переменную, т.к. во внутреннем цикле переменная s меняется, а нам следует каждый шаг внешнего цикла сохранить предыдущее значение s, уменьшив его всего на 1. Используем переменную S1 для этих целей.
  • Бейсик:

    Python:

    s1 = 50
    while True:  # внешний цикл, бесконечный
        s = s1
        # --- код из условия задания --- 
        n = 3
        while s <= 51:
            s = s + 7
            n = n * 2
        # --- конец кода из условия задания --- 
        if n == 96:
            print(s1)
            break
        s1 -= 1
    С++:

    6_3 new::

    Сколько существует различных значений d, оканчивающихся на 8, при вводе которых эта приведенная программа выведnет число 50?

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    var S, N, d: integer;
    begin
      readln(d);
      S := 15;
      N := 10;
      while S <= 2400 do begin
        S := S + d;
        N := N + 5;
      end;
      writeln(N);
    end.
    Бейсик:

    Python:

    d = int(input())
    S = 15
    N = 10
    while S <= 2400:
      S = S + d
      N = N + 5
    print(N)
    С++:

    Типовые задания для тренировки

    Ответ: 4

    Показать решение:

      ✎ Способ 1 (программный):
      Pascalabc.net:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      
      begin
        var counter:=0;
        var d1:=1;
        while true do
        begin
          var d := d1;
          // из условия задачи 
          var s := 15;
          var n := 10;
          while s <= 2400 do
          begin
            s := s + d;
            n:=n + 5;
          end;
          // проверка условий: увеличение счетчика
          if (d mod 10 = 8) and (n = 50) then
          begin
            counter+=1;;
          end;
          d1 += 1;
          // выход из бесконечного цикла
          if d1 = 2400 then break;
        end;
      print (counter)
      end.
    • Вывод:
    • 4
      Бейсик:

      Python:

      counter = 0
      d1 = 1
      while True:
          s = 15
          n = 10    
          d = d1
          # --- код из условия задания --- 
          while s <= 2400:
              s = s + d
              n = n + 5
          if d%10==8 and n==50:
              counter+=1
          d1=d1+1
          if d1 == 2400:
              break
      print (counter)
      С++:


    6_4 new:

    Определите наименьшее и наибольшее введённое значение переменной s, при котором программа выведет число 210. В ответ запишите оба числа в порядке убывания без пробелов и других разделителей

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    var s, n: integer;
    begin
      readln(s);
      n := 600;
      while n > s do begin
        s := s + 3;
        n := n - 6
      end;
      writeln(n)
    end.
    Бейсик:

    Python:

    s = int(input())
    n = 600
    while n > s:
      s = s + 3
      n = n - 6
    print(n)
    С++:

    Ответ: 2315

    Показать решение:

      ✎ Способ 1 (программный):

      PascalAbc.NET:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      
      begin
        var s_ := -100;
        while true do
        begin
          var n := 600;
          var s := s_;
          while n > s do
          begin
            s := s + 3;
            n := n - 6
          end;
          if n = 210 then
            print(s_); 
          s_ += 1;
        if s > 1000 then
          break;
        end;
      end.
    • Вывод:
    • 15 16 17 18 19 20 21 22 23
    • Записываем в порядке убывания:
    • 2315

      Python:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      
      s_ = -100
      while True:  # внешний цикл, бесконечный
          s = s_
          n = 600
          # --- код из условия задания --- 
          while n > s:
              s = s + 3
              n = n - 6
          # --- конец кода из условия задания --- 
          if  n == 210:
              print(s_)
          s_ += 1
          if s > 1000:
              break

    6_5 new:

    Определите, при каком наибольшем положительном введённом значении переменной s программа выведет трёхзначное число.

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    var s, n: integer;
    begin
      readln (s);
      n := 200;
      while s div n >= 2 do
      begin
        s := s + 5;
        n := n + 5
      end;
      writeln(s)
    end.
    Бейсик:

    Python:

    s = int(input())
    n = 200
    while s // n >= 2:
       s = s + 5
       n = n + 5
    print(s)
    С++:

    Ответ: 699

    Показать решение:

      ✎ Способ 1 (программный):

      PascalAbc.NET:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      
      begin
        var s_ := 1000;
        while true do
        begin
          var n := 200;
          var s := s_;
          while s div n >= 2 do
          begin
            s := s + 5;
            n := n + 5
          end;
          if (s > 99) and (s<1000) then
          begin
            print(s_); break; 
          end;
          s_ -= 1;
        end;
      end.

      Python:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      
      s_ = 1000
      while True:  # внешний цикл, бесконечный
          s = s_
          n = 200
          # --- код из условия задания --- 
          while s // n >=2:
              s = s + 5
              n = n + 5
          # --- конец кода из условия задания --- 
          if  99 < s < 1000:
              print(s_)
              break
          s_ -= 1

    6_6 new:

    Получив на вход некоторое натуральное число X, этот алгоритм печатает одно число. Сколько существует чисел Х, для которых алгоритм напечатает число на отрезке [2;500]?

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    var x, s, n: integer;
    begin
      readln(x);
      s := 6 * (x div 15);
      n := 1;
      while s < 300 do begin
        s := s + 18;
        n := n * 2
      end;
      writeln(n)
    end.
    Бейсик:

    Python:

    x = int(input())
    s = 6 * (x // 15)
    n = 1
    while s < 300:
      s = s + 18
      n = n * 2
    print(n)
    С++:

    Ответ: 360

    Показать решение:

      ✎ Способ 1 (программный):

      PascalAbc.NET:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      
      begin
        var x := 1;
        var count := 0;
        while true do
        begin
          var s := 6 * (x div 15);
          var n := 1;
          while s < 300 do 
          begin
            s := s + 18;
            n := n * 2
          end;
          if (n >= 2) and (n <= 500) then
            count += 1;
          x += 1;
          if x > 1000 then
            break;
        end;
        print(count)
      end.

      Python:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      
      x = 1
      count = 0
      while True:  # внешний цикл, бесконечный
          s = 6 * (x // 15)
          n = 1
          while s <300:
              s = s + 18
              n = n * 2
          # --- конец кода из условия задания --- 
          if  1 < n < 501:
              count+=1
          x += 1
          if x > 1000:
              break
      print (count)

    Решения подобных заданий прошлых лет

    Определить, какое число пропущено

    6_14:

    Сопоставьте формулу:

    и программу, предназначенную для расчета по данной формуле. Программа написана правильно, а в формуле допущена ошибка.

    Определите, где и какое число в формуле пропущено?

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    var k,n,p,l,s,x:integer;
    begin
      writeln('введите n='); readln(n);
      writeln('введите x='); readln(x);
      s:=0;
      p:=1;
      l:=x;
      For k:=1 to n do 
        begin
          p:=p * k;
          s:=s + 3*l/p;
          l:=l*x;
        end;
      writeln('S=',S:5:2);
    end.
    Бейсик:

    INPUT "введите n=", n
    INPUT "введите x=", x
    s=0: p=1
    l=x
    FOR k:=1 to n  
          p = p * k: s = s + 3*l/p
          l = l*x
    NEXT k
    PRINT "S=",S
    END
    Python:

    n = int(input('введите n='))
    x = int(input('введите x='))
    s=0
    p=1
    l=x
    For k in range (1,n+1): 
          p*= k
          s+=3*l/p
          l*=x
    print('S=',S)
    С++:

    #include <iostream>
    using namespace std;
    int main() {
    int k,n,p,s,x;
    printf("введите n="); scanf("%d",&n);
    printf("введите x="); scanf("%d",&x);
    l=x;
    for (k=1,s=0,p=1;k<=n;k++) {
      p*=k;
      s+=3*l/p;
      l*=x;
    }
    printf("s=%d",s);
    }

    Ответ: 3

    Показать решение:

    • Рассмотрим формулу:

    • Фактически она обозначает: сумма xk/ k! для всех k, начиная от 1 до n.

    • Рассмотрим алгоритм программы:
    • Основные действия происходят в цикле, в котором k изменяется от 1 до n (n вводится в начале программы):
    • For k:=1 to n do
    • В следующей строке кода происходит вычисление факториала числа k (в первой итерации цикла 1!, во второй итерации 2! и т.д.):
    • p:=p * k;
    • Следующее выражение служит для подсчета x в степени k (переменной l в начале программы присваивается значение введенного x):
    • l:=l*x;
    • Основная же формула сумматора заключена в строке:
    • s:=s + 3*l/p;
    • Видим, что в исходной заданной формуле в числителе отсутствует число 3.
    • Т.е. исходная формула должна была выглядеть так:

    Простые задания с двумя линейными непересекающимися функциями

    6_3:

    Определите, что будет напечатано в результате работы следующего фрагмента программы:

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    var k,s:integer;
    begin
      s:=512;
      k:=0;
      while s<2048 do
        begin
          s:=s+64;
          k:=k+1;
         end;
      write(k);
    end.
    Бейсик:

    DIM S, K AS INTEGER
    S = 512
    K = 0
    WHILE S < 2048
      S = S + 64
      K = K + 1
    WEND
    PRINT K
    Python:

    s = 512
    k = 0
    while s < 2048:
      s = s + 64
      k = k + 1
    print(k)
    С++:

    #include <iostream>
    using namespace std;
    int main() {
    int s = 512, k = 0;
    while (s < 2048) {
      s = s + 64;
      k = k + 1;
    }
    cout << k << endl;
    return 0;
    }

      
    Подобные задания для тренировки

    Ответ: 24

    Показать решение:

    Рассмотрим алгоритм программы:

    • В цикле k увеличивается на единицу (k — счетчик). Соответственно, k будет равно количеству итераций (повторов) цикла. После завершения работы цикла k выводится на экран, т.е. это и есть результат работы программы.
    • В цикле s увеличивается на 64. Для простоты расчетов возьмем начальное s не 512, а 0. Тогда условие цикла поменяется на s < 1536 (2048 – 512 = 1536):
    • s:=0;
      k:=0;
      while s < 1536 do
         begin
         ...
      
    • Цикл будет выполняться пока s<1536, а s увеличивается на 64, отсюда следует что итераций цикла (шагов) будет:
    • 1536 / 64 = 24
    • Соответственно, k = 24.

    📹 Видео
    📹 Видеорешение на RuTube здесь (теоретическое решение)


    Определите, что будет напечатано в результате выполнения программы:

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    var s, i: integer;
    begin
    i := 1;
    s := 105;
    while s > 5 do
    begin
      s := s - 2;
      i := i + 1
    end;
    writeln(i)
    end.
    Бейсик:

    DIM S, I AS INTEGER
    I = 1
    S = 105
    WHILE S > 5
      S = S - 2
      I = I + 1
    WEND
    PRINT I
    Python:

    i = 1
    s = 105
    while s > 5:
      s = s - 2
      i = i + 1
    print(i)
    С++:

    #include <iostream>
    using namespace std;
    int main() {
    int s = 105, i = 1;
    while (s > 5) {
      s = s - 2;
      i = i + 1;
    }
    cout << i << endl;
    return 0;
    }

    Ответ: 51

    Показать решение:

    • Рассмотрим алгоритм. Цикл зависит от переменной s, которая уменьшается каждую итерацию цикла на 2.
    • В цикле также присутствует счетчик – переменная i, которая увеличится на единицу ровно столько раз, сколько итераций (проходов) цикла. Т.е. в результате выполнения программы распечатается значение, равное количеству итераций цикла.
    • Поскольку условие цикла зависит от s, нам необходимо посчитать, сколько раз сможет s уменьшиться на 2 в цикле. Для удобства подсчета изменим условие цикла на while s > 0; так как мы s уменьшили на 5, соответственно, изменим и 4-ю строку на s:=100 (105-5):
    • ...
      s := 100;
      while s > 0 do
      begin
      ...
      
    • Для того чтобы посчитать, сколько раз выполнится цикл, необходимо 100 разделить на 2, т.к. s каждый шаг цикла уменьшается на 2:
      100 / 2 = 50 -> количество итераций цикла
      
    • В 3-й строке видим, что начальным значением i является 1, т.е. в первую итерацию цикла i = 2. Значит, нам необходимо к результату (50) прибавить 1.
    • 50 + 1 = 51
    • Это значение и будет выведено на экран.

    6 задание. Демоверсия ЕГЭ 2018 информатика:

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    var s, n: integer;
    begin
    s := 260;
    n := 0;
    while s > 0 do
    begin
      s := s - 15;
      n := n + 2
    end;
    writeln(n)
    end.
    Бейсик:

    DIM S, N AS INTEGER
    S = 260
    N = 0
    WHILE S > 0
      S = S - 15
      N = N + 2
    WEND
    PRINT N
    Python:

    s = 260
    n = 0
    while s > 0:
      s = s - 15
      n = n + 2
    print(n)
    С++:

    #include <iostream>
    using namespace std;
    int main() {
    int s = 260, n = 0;
    while (s > 0) {
      s = s - 15;
      n = n + 2;
    }
    cout << n << endl;
    return 0;
    }

    Ответ: 36

    Показать решение:

      Рассмотрим алгоритм:

    • Цикл зависит от значения переменной s, которая изначально равна 260. В цикле переменная s постоянно меняет свое значение, уменьшаясь на 15.
    • Цикл завершит свою работу когда s <= 0. Значит, необходимо посчитать сколько чисел 15 “войдет” в число 260, иными словами:
    • 260 / 15 ~ 17,333...
    • Эта цифра должна соответствовать количеству шагов (итераций) цикла. Так как условие цикла строгое – s > 0, то увеличим полученное число на единицу:
    • 17 + 1 = 18 итераций цикла
      
      Проверим:
      17 * 15 = 255  (< 260)
      18 * 15 = 270 (> 260)
      
    • Проверим на более простом примере. Допустим, изначально s=32. Два прохождения цикла даст нам s = 32/15 = 2,133... Число 2 больше 0, соответственно, цикл будет работать еще третий раз.
    • В результате работы программа распечатывает значение переменной n (искомый результат). В цикле переменная n, изначально равная 0, увеличивается на 2. Так как цикл включает 18 итераций, то имеем:
    • n = 18 * 2 = 36

    📹 Видео
    📹 Видеорешение на RuTube здесь (теоретическое решение)


    6_4:

    Определите, что будет напечатано в результате выполнения следующего фрагмента программы:

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    var k,s: integer;
    begin
      k:=1024;
      s:=50;
      while s>30 do
      begin
        s:=s-4;
        k:=k div 2;
      end;
      write(k)
    end.
    Бейсик:

    DIM S, K AS INTEGER
    S = 50
    K = 1024
    WHILE S > 30
      S = S - 4
      K = K  2
    WEND
    PRINT K
    Python:

    s = 50
    k = 1024
    while s > 30:
      s = s - 4
      k = k // 2
    print(k)
    С++:

    #include <iostream>
    using namespace std;
    int main() {
    int s = 50, k = 1024;
    while (s > 30) {
      s = s - 4;
      k = k / 2;
    }
    cout << k << endl;
    return 0;
    }

    Ответ: 32

    📹 Видео
    📹 Видеорешение на RuTube здесь (теоретическое решение)


    6_5:

    Определите значение переменной c после выполнения следующего фрагмента программы. Ответ запишите в виде целого числа.

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    
    a:=-5;
    c:=1024;
    while a<>0 do
    begin
      c:=c div 2;
      a:=a + 1
    end;
    Бейсик:

    A = -5
    C = 1024
    WHILE A <> 0
      C = C  2
      A = A + 1
    WEND
    Python:

    a = -5
    c = 1024
    while a != 0:
      c = c // 2
      a = a + 1
    С++:

    int a = -5, c = 1024;
    while (a != 0) {
      c = c / 2;
      a = a + 1;
    }

    Ответ: 32

    📹 Видео
    📹 Видеорешение на RuTube здесь (теоретическое решение)


    6_12:

    Определите, что будет напечатано в результате работы следующего фрагмента программы.

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    var n, s: integer;
    begin
    n := 1;
    s := 0;
    while s <= 365 do begin
      s := s + 36;
      n := n * 2
    end;
    write(n)
    end.
    Бейсик:

    N = 1
    S = 0
    WHILE S <= 365
      S = S + 36
      N = N * 2
    WEND
    PRINT N
    Python:

    n = 1
    s = 0
    while s <= 365:
      s = s + 36
      n = n * 2
    print(n)
    С++:

    using namespace std;
    int main() {
    int n = 1, s = 0;
    while (s <= 365) {
      s = s + 36;
      n = n * 2;
    }
    cout << n << endl;
    return 0;
    }

    Ответ: 2048

    Показать решение:

    • с каждым шагом цикла значение s увеличивается на 36, пока не станет больше 365; а значение n увеличивается в 2 раза, так что n=2k, где k – это число итераций цикла;
    • поскольку s увеличивается на 36, конечное значение s должно быть равно 0+36*k , достигается при k=11 (и s=36*11=396);
    • тогда n = 2k = 211 = 2048.

    Сумма или разность двух линейных функций (while s – n или while s + n)

    6_7:

    Запишите число, которое будет напечатано в результате выполнения следующей программы:

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    var s, n: integer;
    begin
    s := 522;
    n := 400;
    while s - n > 0 do
      begin
      s := s - 20;
      n := n - 15
      end;
    write(s)
    end.
    Бейсик:

    DIM S, N AS INTEGER
    S = 522
    N = 400
    WHILE S - N > 0
      S = S - 20
      N = N - 15
    WEND
    PRINT S
    Python:

    s = 522
    n = 400
    while s - n > 0:
      s = s - 20
      n = n - 15
    print(s)
    С++:

    #include <iostream>
    using namespace std;
    int main() {
    int s = 522, n = 400;
    while (s - n > 0) {
      s = s - 20;
      n = n - 15;
    }
    cout << s << endl;
    return 0;
    }

      
    Подобные задания для тренировки

    Ответ: 22

    Показать решение:

    • В алгоритме присутствует цикл. Для того, чтобы разобраться в алгоритме, выполним трассировку начальных итераций цикла:
    • № шага условие цикла s n
      1 522-400=122
      122 > 0
      522-20=502 400-15=385
      2 502-385=117
      117 > 0
      502-20=482 385-15=370
      3 482-370=112
      112 > 0
    • Видим, что в условии разница между значениями составляет 5:
    • 122 - 117 = 5
      117 - 112 = 5
      ...
      
    • Таким образом, чтобы определить количество итераций (шагов) цикла, необходимо значение условия цикла, полученное в первой итерации, разделить на 5:
    • 122 / 5 = 24,4
      
      24 * 5 = 120 (120 + 2 = 122)
      

      Это значит, что на 24-й итерации цикла переменные s и n получили такие значения, после которых условие еще осталось истинным: 2 > 0. На 25-м шаге выполняется это условие:

      № шага условие цикла s n
      25 2 > 0 s-20=… n-15=…
    • В конце выполнения 25-й итерации, получаем условие для 26-й итерации:
    • 25 * 5 = 125 (125 - 3 = 122)
      
      № шага условие цикла s n
      25 2 > 0 s-20=… n-15=…
      26 3 < 0 не выполняется не выполняется
    • Значит, всего в цикле присутствует 25 итераций, в каждой из которых s уменьшается на 20. Посчитаем, на сколько уменьшится значение s в общем:
    • 25 * 20 = 500 (за 25 итераций)
      
      522 - 500 = 22 (вычитаем из исходных данных)
      

    Результат: 22

    📹 Видео

    📹 Видеорешение на RuTube здесь (теоретическое решение)


    6_13

    Запишите число, которое будет выведено в результате работы программы:

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    var s, n: integer;
    begin
      s := 10;
      n := 55;
      while n > s do begin
        s := s + 1;
        n := n - 1
      end;
      writeln(n)
    end.
    Бейсик:

    DIM S, N AS INTEGER
    S = 10
    N = 55
    WHILE N > S
      S = S + 1
      N = N - 1
    WEND
    PRINT N
    Python:

    s = 10
    n = 55
    while n > s:
      s = s + 1
      n = n - 1
    print(n)
    С++:

    #include <iostream>
    using namespace std;
    int main() {
    int s = 10, n = 55;
    while (n > s) {
      s = s + 1;
      n = n - 1;
    }
    cout << n << endl;
    return 0;
    }

    Ответ: 32

    Показать решение:

    • Для условия цикла – перенесем влево:
    • n - s > 0
    • Согласно начальным значениям, имеем:
    • 55 - 10 = 45
    • Запишем, как будет изменяться условие цикла в каждой итерации (в каждом шаге):
    • n - 1 > s + 1 =>
      n - s - 2 > 0
      
    • Т.е. условие цикла будет истинным пока возможно вычитать 2. Сколько раз можно вычесть два из 45?
    • для 22 итераций:
      2 * 22 = 44
      в условии цикла имеем 45 > 44, т.е. условие еще истинно
      для 23 итераций:
      2 * 23 = 46
      в условии цикла имеем 45 > 46 - условие ложно, т.е. цикл прекращает работу
    • Соответственно, получили 23 итерации цикла.
    • Изначально n = 55. С каждой итерацией выполнялось n-1. Посчитаем n:
    • n = 55 - 23 = 32

    Поиск наименьшего/наибольшего целого введенного числа d

    ЕГЭ 6.8:

    При каком наименьшем целом введенном числе d после выполнения программы будет напечатано число 192?

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    var k,s,d: integer;
    begin
      readln (d);
      s:=0;
      k:=0;
      while k < 200 do
      begin
        s:=s+64;
        k:=k+d;
      end;
      write(s);
    end.
    Бейсик:

    DIM S, K, D AS INTEGER
    INPUT D
    S = 0
    K = 0
    WHILE K < 200
      S = S + 64
      K = K + D
    WEND
    PRINT S
    Python:

    d = int (input ())
    s = 0
    k = 0
    while k < 200:
      s = s + 64
      k = k + d
    print(s)
    С++:

    #include <iostream>
    using namespace std;
    int main() {
    int s = 0, k = 0;
    int d;
    cin >> d;
    while (k < 200) {
      s = s + 64;
      k = k + d;
    }
    cout << s << endl;
    return 0;
    }

      
    Подобные задания для тренировки

    Ответ: 67

    Показать решение:

    Рассмотрим алгоритм программы:

    • Цикл зависит от переменной k, которая каждую итерацию цикла увеличивается на значение d (вводимое). Цикл закончит “работу”, когда k сравняется с 200 или превысит его (k >= 200).
    • Результатом программы является вывод значения переменной s. В цикле s увеличивается на 64.
    • Так как по заданию необходимо, чтобы вывелось число 192, то число повторов цикла определим так:
    • 64 * x = 192
      число повторов: x = 192 / 64 = 3  
      
    • Так как в цикле k увеличивается на значение d, а повторов цикла 3 (при этом цикл завершается при k>=200), составим уравнение:
    • 3 * d = 200 
      d = 200/3 ~ 66,66
      
    • Поскольку число получилось нецелое, то проверим и 66 и 67. Если мы возьмем 66, то:
    • 66 + 66 + 66  = 198  (< 200)

      т.е. цикл после трех прохождений еще продолжит работу, что нам не подходит.

    • Для 67:
    • 67 + 67 + 67 = 201 (>200)
    • Данное число 67 нас устраивает, оно наименьшее из возможных, что и требуется по заданию.

    📹 Видео
    📹 Видеорешение на RuTube здесь


    6_9:

    Запишите через запятую наименьшее и наибольшее значение числа d, которое нужно ввести, чтобы после выполнения программы было напечатано 153?

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    var n, s, d: integer;
    begin
      readln(d);
      n := 33;
      s := 4;
      while s <= 1725 do begin
        s := s + d;
        n := n + 8
      end;
      write(n)
    end.
    Бейсик:

    DIM S, N, D AS INTEGER
    INPUT D
    N = 33
    S = 4
    WHILE S <= 1725
      S = S + D
      N = N + 8
    WEND
    PRINT N
    Python:

    d = int (input ())
    n = 33
    s = 4
    while s <= 1725:
      s = s + d
      n = n + 8
    print(n)
    С++:

    #include <iostream>
    using namespace std;
    int main() {
    int s = 4, n = 33;
    int d;
    cin >> d;
    while (s <= 1725) {
      s = s + d;
      n = n + 8;
    }
    cout << n << endl;
    return 0;
    }

    Ответ: 115, 122

    Показать решение:

    Разберем листинг программы:

    • Цикл программы зависит от значения переменной s, которая в цикле постоянно увеличивается на значение d (d вводится пользователем в начале программы).
    • Кроме того, в цикле переменная n увеличивается на 8. Значение переменной n выводится на экран в конце программы, т.е. по заданию n к концу программы должно n = 153.
    • Необходимо определить количество итераций цикла (прохождений). Так как начальное значение n = 33, а в конце оно должно стать 153, в цикле увеличиваясь на 8, то сколько раз 8 “поместится” в 120 (153 – 33)? :
    • 120 / 8 = 15 раз (количество итераций цикла)
    • Как мы определили, цикл зависит от s, которая в начале программы s = 4. Для простоты работы примем, что s = 0, тогда изменим и условие цикла: вместо s <= 1725 сделаем s <= 1721 (1725-1721)
    • ...
       s := 0;
       while s <= 1721 do begin
      ...
      
    • Найдем d. Так как цикл выполняется 15 раз, то необходимо найти такое целое число, которое при умножении на 15 возвращало бы число большее 1721:
    • 1721 / 15 = 114,733 - не целое, не подходит
      1722 / 15 = 114,8 - не целое, не подходит
      ...
      берем кратное 5:
      1725 / 15 = 115 - целое, подходит!
      
    • 115 – это наименьшее d при котором n станет равным 153 (за 15 шагов цикла).
    • Найдем наибольшее d. Для этого надо найти такое число, которое соответствует неравенствам:
    • 14 * d <= 1721
      при этом:
      15 * d > 1721
      
    • Найдем:
    • 14 * 122 = 1708 (<=1721)
      15 * 122 = 1830 (>1721)
      
    • Наибольшее d=122

    📹 Видео


    Усложненные задания с двумя линейными функциями

    6_6:

    Запишите число, которое будет напечатано в результате выполнения следующей программы:

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    var s, n: integer;
    begin
      s := 0;
      n := 0;
      while 2*s*s < 123 do begin
        s := s + 1;
        n := n + 2
      end;
      writeln(n)
    end.
    Бейсик:

    DIM S, N AS INTEGER
    S = 0
    N = 0
    WHILE 2*S*S < 123
      S = S + 1
      N = N + 2
    WEND
    PRINT N
    Python:

    s = 0
    n = 0
    while 2*s*s < 123:
      s = s + 1
      n = n + 2
    print(n)
    С++:

    #include <iostream>
    using namespace std;
    int main() {
    int s = 0, n = 0;
    while (2*s*s < 123) {
      s = s + 1;
      n = n + 2;
    }
    cout << n << endl;
    return 0;
    }

      
    Подобные задания для тренировки

    Ответ: 16

    Показать решение:

    Разберем листинг программы:

    • В цикле переменная s постоянно увеличивается на единицу (работает как счетчик), а переменная n в цикле увеличивается на 2.
    • В результате работы программы на экран выводится значение n.
    • Цикл зависит от s, причем работа цикла завершится когда 2 * s2 >= 123.
    • Необходимо определить количество прохождений цикла (итераций цикла): для этого определим такое наименьшее возможное s, чтобы 2 * s2 >= 123:
    • 1 шаг: s = 2*12=2
      2 шаг: s = 2*22=8
      3 шаг: s = 2*32=18
      ...
      7 шаг: s = 2*72=98 (меньше 123, т.е. цикл еще работает)
      8 шаг: s = 2*82=128 (больше 123, цикл не работает! )
      

      Либо просто нужно было бы найти такое наименьшее возможное четное число >= 123, которое при делении на 2 возвращало бы вычисляемый корень числа:

      s=124/2 = √62 - не подходит!
      s=126/2 = √63 - не подходит!
      s=128/2 = √64 = 8 - подходит!
      
    • Таким образом, программа выполнит 8 итераций цикла.
    • Определим n, которая увеличивается каждый шаг цикла на 2, значит:
    • n = 2 * 8 = 16

    📹 Видео


    Арифметическая и геометрическая прогрессия

    6_10:

    Определите, что будет напечатано в результате работы следующего фрагмента программы:

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    var k, s: integer;
    begin
      s:=3;
      k:=1;
      while k < 25 do begin
        s:=s+k;
        k:=k+2;
      end;
      write(s);
    end.
    Бейсик:

    DIM S, K AS INTEGER
    S = 3
    K = 1
    WHILE K < 25
      S = S + K
      K = K + 2
    WEND
    PRINT S
    Python:

    s = 3
    k = 1
    while k < 25:
      s = s + k
      k = k + 2
    print(s)
    С++:

    #include <iostream>
    using namespace std;
    int main() {
    int s = 3, k = 1;
    while (k < 25) {
      s = s + k;
      k = k + 2;
    }
    cout << s << endl;
    return 0;
    }

      
    Подобные задания для тренировки

    Ответ: 147

    Показать решение:

    Разберем листинг программы:

    • Результатом программы является вывод значения s.
    • В цикле s меняется, увеличиваясь на k, при начальном значении s = 3.
    • Цикл зависит от k. Выполнение цикла завершится при k >= 25. Начальное значение k = 1.
    • В цикле k постоянно увеличивается на 2 -> значит, можно найти количество итераций цикла.
    • Количество итераций цикла равно:
    • n = 25 / 2 ~ 12 
      

      (т.к. k изначально равнялось 1, то в последнее, 12-е прохождение цикла, k = 25; условие цикла ложно)

    • В s накапливается сумма арифметической прогрессии, последовательность элементов которой удобней начать с 0 (а не с 3, как в программе). Поэтому представим, что в начале программы s = 0. Но при этом не забудем, что в конце нам необходимо будет к результату прибавить 3!
    • s:=0;
      k:=1;
      while k < 25 do begin
       ...
      
    • Тогда арифметическая прогрессия будет выглядеть:
    • 1 + 3 + 5 + 7 ... 
      количество членов прогрессии - 12, т.к. 12 итераций цикла
      
    • Существует формула вычисления суммы арифметической прогрессии:
    • s = ((2 * a1 + d * (n – 1)) / 2) * n

      где a1 – первый член прогрессии,
      d – разность,
      n – количество членов прогрессии (в нашем случае – кол-во итераций цикла)

    • Подставим значения в формулу:
    • (2 * 1 + 2 * 11) / 2 * 12 = 144
      
    • Не забудем, что мы к результату должны прибавить 3:
    • 144+3 = 147
      
    • Это и есть значение s, которое выводится в результате работы программы.

    📹 Видео


    Государственный выпускной экзамен ГВЭ 2019 (информатика ГВЭ ФИПИ, № 15):

    Запишите число, которое будет напечатано в результате выполнения программы:

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    var n, s: integer;
    begin
    n := 1;
    s := 0;
    while n <= 1000 do
      begin
      s := s + n;
      n := n * 2
      end;
    write(s)
    end.
    Бейсик:

    DIM N, S AS INTEGER
    N = 1
    S = 0
    WHILE N <= 1000
      S = S + N
      N = N * 2
    WEND
    PRINT S
    Python:

    n = 1
    s = 0
    while n <= 1000:
      s = s + n
      n = n * 2
    print(s)
    С++:

    #include <iostream>
    using namespace std;
    int main() {
    int n = 1, s = 0;
    while (n <= 1000) {
      s = s + n;
      n = n * 2;
    }
    cout << s << endl;
    return 0;
    }

    Ответ: 1023

    Показать решение:

      Рассмотрим алгоритм:

    • Условие цикла зависит от переменной n, которая изменяется в цикле согласно получению степеней двойки:
    • 1  2  4  8  16  32  64  128  256  512  1024
      
    • Когда переменная n принимает значение 1024 (11-й шаг цикла), условие цикла становится ложным и цикл перестает работать. На экран выводится значение s.
    • Переменная s – это сумма элементов геометрической прогрессии, т.к. в ней аккумулируются значения n (числовой ряд, представляющий собой геометрическую прогрессию).
    • Вспомним формулы суммы геометрической прогрессии:
    • 1.

      [ S_{n} = frac {b_1-b_{n}*q}{1-q} ]

      2.

      [ S_{n} = b_{1} * frac {1-q^n}{1-q} ]

    • В нашем случае знаменатель q = 2, первый элемент прогрессии b1 = 1. Обратим внимание, что на последнем шаге к сумме добавляется значение 512, т.е. n = 10, а bn = 512. Только после этого n еще раз увеличивается в 2 раза и становится = 1024.
    • Вычислим s по формуле, подставив необходимые значения:
    • [ S_{n} = frac {1-512*2}{1-2} =1023 ]

    • Проверим по второй формуле:
    • [ S_{n} = 1 * frac {1-2^{10}}{1-2}=1023 ]

    • Так как в результате на экран выводится s, то ответ 1023.

    Программирование: массивы и матрицы

    Наибольшее или наименьшее значение переменной s (сумматор)

    Досрочный экзамен 2020 г., вариант 1:

    В программе используется одномерный целочисленный массив A с индексами от 0 до 11. Значения элементов массива A[i] приведены в таблице.

    i 0 1 2 3 4 5 6 7 8 9 10 11
    A[i] 14 13 15 8 4 12 30 21 22 16 5 9

    Определите значение переменной s после выполнения следующего фрагмента этой программы

    Язык программирования Паскаль:

    s := 0;
    n := 1;
    for i := 0 to 11 do
     if A[i] > A[n] then
      s := s + A[i] + i
     else
      A[n] := A[i];
    Бейсик:

    s = 0
    n = 1
    FOR i = 0 TO 11
     IF A(i) > A(n) THEN
       s = s + A(i) + i
     ELSE
       A(n) = A(i)
     END IF
    NEXT i
    Python:

    s = 0
    n = 1
    for i in range(0, 12):
     if A[i] > A[n]:
       s += A[i] + i
     else:
       A[n] = A[i]
    С++:

    s = 0;
    n = 1;
    for (int i = 0; i < 12; i++)
    {
     if (A[i] > A[n])
       s += A[i] + i;
     else
       A[n] = A[i];
    }

    Ответ: 202

    Показать решение:

    Результат: 202

    📹 Видео


    6_16:

    В программе описан одномерный целочисленный массив А с индексами от 0 до 10.

    Язык программирования Паскаль:

    s:=0;
    n:=10;
    for i:=0 to n-1 do begin
      s:= s + A[i] + A[i+1]
    end;

    В начале выполнения этого фрагмента в массиве находились двухзначные четные натуральные числа.

      
    Какое наибольшее значение может иметь переменная s после выполнения данной программы?

    Ответ: 1960

    Показать решение:

    Рассмотрим алгоритм фрагмента программы:

    • Цикл выполняется 10 раз: от 0 до 9 (т.к. n-1).
    • В цикле повторяется операция, суммирующая два подряд идущих элемента массива, – текущего и следующего:
    • A[i] + A[i+1]
    • Данная сумма накапливается в переменной s, значение которой требуется узнать в задаче.
    • Поскольку по заданию необходимо найти наибольшее значение переменной s, и по заданию элементы массива – двухзначные четные натуральные числа, то представим, что все элементы равны самому большому двухзначному четному числу – 98. Это будет оптимальным вариантом.
    • В первый проход цикла получим:
    • s = 0 + 98 + 98 = 196
    • Полученная сумма будет каждый проход цикла увеличиваться на то же самое число (196):
    • s = 196 + 98 + 98
    • Так как проходов (итераций) цикла 10, то получим:
    • 196 * 10 = 1960

    📹 Видео


    6_17:

    В программе описан одномерный целочисленный массив А с индексами от 0 до 10.

    Язык программирования Паскаль:

    s:=1;
    n:=10;
    for i:=1 to 5 do begin
      s:= s * A[i] * A[n-i+1]
    end;

    В начале выполнения этого фрагмента в массиве находились однозначные четные натуральные числа.

      
    Какое наименьшее значение может иметь переменная s после выполнения данной программы?

    Ответ: 1024

    Показать решение:

    Рассмотрим алгоритм фрагмента программы:

    • Цикл выполняется 5 раз: от 1 до 5.
    • В цикле повторяется операция произведения двух элементов массива:
    • A[i] * A[n-i+1]
    • Определим, какие элементы перемножаются, подставив для n и i конкретные значения:
    • 1 шаг: A[1]*A[10]
      2 шаг: A[2]*A[9]
      3 шаг: A[3]*A[8]
      4 шаг: A[4]*A[7]
      5 шаг: A[5]*A[6]
      
    • Результат каждой операции умножения накапливается в переменной s, значение которой и требуется найти.
    • Поскольку в s накапливается произведение элементов массива, а по заданию элементы – однозначные четные натуральные числа, то представим, что в массиве все элементы равны самому малому однозначному четному числу – 2. Это будет оптимальным вариантом, т.к. по заданию, необходимо определить наименьшее значение.
    • В первый проход цикла получим:
    • s = 1 * 2 * 2 = 4
    • Полученное произведение будет каждый проход цикла перемножаться на предыдущее значение (4 – в первом шаге, 16 – во втором шаге и т.п.):
    • s = 4 * 2 * 2 = 16
      ...
      
    • Так как проходов цикла 5, то получим:
    • 45 = 1024

    📹 Видео


    Перестановка в массиве. Определить значение переменной

    6 (19) задание. Демоверсия ЕГЭ 2018 информатика:

    В программе используется одномерный целочисленный массив A с индексами от 0 до 9. Значения элементов равны 3, 0, 4, 6, 5, 1, 8, 2, 9, 7 соответственно, т.е. A[0] = 3, A[1] = 0 и т.д.

    Определите значение переменной c после выполнения следующего фрагмента этой программы:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    c := 0;
    for i := 1 to 9 do
     if A[i-1] > A[i] then
     begin
       c := c + 1;
       t := A[i];
       A[i] := A[i-1];
       A[i-1] := t;
     end;

    Ответ: 5

    Показать решение:

    Результат: 5

    📹 Видео


    6_19:

    В программе используется одномерный целочисленный массив A с индексами от 0 до 9. Значения элементов равны 1, 3, 4, 7, 2, 9, 1, 2, 3, 0 соответственно, т.е. A[0] = 1, A[1] = 3 и т.д.

    Определите значение переменной c после выполнения следующего фрагмента этой программы:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    c := 0;
    for i := 1 to 9 do
     if A[i] > A[0] then
     begin
       c := c + 1;
       t := A[i];
       A[i] := A[0];
       A[0] := 2*t;
     end;

    Ответ: 2

    Показать решение:

    • Рассмотрим изменение всех переменных и элементов массива для каждой итерации (прохода) цикла:
    • 1 2 3 4 5 6 7 8 9
      i 1 2 3 4 5 6 7 8 9
      if 3>4
      true
      4>6
      false
      7>6
      true
      2>14
      false
      9>14
      false
      1>14
      false
      2>14
      false
      3>14
      false
      0>14
      false
      c 1 2
      t 3 7
      A[i] 1 6
      A[0] 6 14

    📹 Видео


    6_20:

    В программе используется одномерный целочисленный массив A с индексами от 0 до 9. Значения элементов равны 0, 7, 1, 3, 2, 1, 8, 9, 6, 3 соответственно, т.е. A[0] = 0, A[1] = 7 и т.д.

    Определите значение переменной j после выполнения следующего фрагмента этой программы:

    1
    2
    3
    4
    5
    6
    7
    8
    
    j:=9;
    while A[j] + A[j-1] > 4 do
     begin
      t:=A[j];
      A[j]:=A[j-1];
      A[j-1]:=t;
      j:=j-1;
     end;

    Ответ: 6

    Показать решение:

    • В задании используется цикл while – с предусловием. Такой цикл выполняется пока условие истинно.
    • В условии цикла сумма каждого элемента массива с предыдущим, начиная с девятого (j=9), сравнивается с числом 4: если сумма элементов больше 4 то цикл выполняется.
    • Для первой итерации цикла имеем:
      while A[9] + A[8] > 4 do
      ...
      
    • Как только встретится сумма элементов, которая меньше либо равна четырем, цикл прекратит свою работу.
    • В цикле происходит обмен значений двух элементов массива, сумма которых рассматривается в условии цикла (через переменную t). Кроме того, происходит уменьшение счетчика цикла, чтобы осуществился переход к следующему элементу массива (j:=j-1).
    • Таким образом, надо узнать сумму элементов, начиная с элементов A[9]+A[8], затем A[8]+A[7] и т.д.:
    • A[9]+A[8] = 3+6 > 4 - да, значит обмен: A[9]=6 A[8]=3, j=8
      A[8]+A[7] = 3+9 > 4 - да, значит обмен: A[8]=9 A[7]=3, j=7
      A[7]+A[6] = 3+8 > 4 - да, значит обмен: A[7]=8 A[6]=3, j=6
      A[6]+A[5] = 3+1 > 4 - нет, цикл прекращает свою работу
      
    • Последнее значение счетчика j было равно 6.

    Разбор досрочного ЕГЭ по информатике 2019:

    В программе используется одномерный целочисленный массив A с индексами от 0 до 11. Значения элементов равны 20, 19, 33, 21, 42, 13, 12, 24, 4, 22, 6, 10, т.е. A[0]=20, A[1]=19 и т.д.

    Определите значение переменной s после выполнения следующего фрагмента этой программы:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      n := 1;
      s := 1;
      for i := 1 to 11 do
        if A[i] < A[n] then begin
          s := s * i;
          t := A[i];
          A[i] := A[n];
          A[n] := t;
        end;

      
    Типовые задания для тренировки – демоверсия ЕГЭ информатика 2020

    Ответ: 240

    📹 Видео


    6_22:

    В программе используется одномерный целочисленный массив A с индексами от 0 до 9. Значения элементов равны 21, 16, 7, 12, 18, 3, 8, 13, 11, 17, т.е. A[0]=21, A[1]=16 и т.д.

    Определите значение переменной s после выполнения следующего фрагмента этой программы:
    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    s := 0;
    n := 4;
    for i:=0 to 9 do
      if A[i] <= A[n] then begin
        s := s + A[i];
        t := A[i];
        A[i] := A[n];
        A[n] := t;
        n := i mod 3;
      end;
    writeln(s);
    Бейсик:

    s=0: n=4
    FOR k=1 to 10  
        IF A(i) <= A(n) THEN
          s = s + A(i)
          t = A(i)
          A(i) = A(n)
          A(n) = t
          n = i MOD 3
        END IF
    NEXT k
    PRINT S
    END
    Python:

    s = 0
    n = 4
    for i in range(10):
      if A[i] <= A[n]:
        s = s + A[i]
        t = A[i]
        A[i] = A[n]
        A[n] = t
        n = i % 3
    print(s)
    С++:

    s = 0;
    n = 4;
    for (i=0; i<=9; i++)
      if (A[i]<=A[n])
        {
        s+=A[i];
        t=A[i];
        A[i]=A[n];
        A[n]=t;
        n=i%3;
        }
    cout << s;

      
    Типовые задания для тренировки

    Ответ: 75

    Показать решение:

    • Рассмотрим алгоритм. Построим трассировочную таблицу, каждая строка которой – очередная итерация цикла.
    • i <= ? 0 1 2 3 4 5 6 7 8 9 s n
      21 16 7 12 18 3 8 13 11 17 0 4
      0 21<=18
      нет
      21 18
      1 16<=18
      да
      16
      18
      18
      16
      16 1 mod 3 = 1
      2 7<=18
      да
      18
      7
      7
      18
      16+7=23 2 mod 3 = 2
      3 12<=18
      да
      18
      12
      12
      18
      23+12=35 3 mod 3 = 0
      4 16<=21
      да
      21
      16
      16
      21
      35+16=51 4 mod 3 = 1
      5 3<=7
      да
      7
      3
      3
      7
      51+3=54 5 mod 3 = 2
      6 8<=12
      да
      12
      8
      8
      12
      54+8=62 6 mod 3 = 0
      7 13<=16
      да
      16
      13
      13
      16
      62+13=75 7 mod 3 = 1
      8 нет 3 11
      9 нет 13 17
    • При последнем изменении s стало равным 75.

    📹 Видео


    6_23:

    В результате выполнения программы напечатано число 6.

      
    Какое наибольшее значение может иметь переменная S после выполнения программы?

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    var k, m, S, N: integer; 
        Dat: array[1..100] of integer; 
    begin 
      N:= 5; 
      m := 0; S := 0; 
      for k := 1 to N do      
        readln(Dat[k]); 
      for k := 1 to N do begin
        S := S + 2 * Dat[k];
        if  Dat[k]>m then
          begin
            m := Dat[k]
          end
      end; 
      writeln(m) 
    end.
    Бейсик:

    N=5
    m=0
    S=0
    FOR k=1 to N
       INPUT Dat(k) 
    NEXT k 
    FOR k=1 to N
        S = S + 2 * Dat(k)
        IF Dat(k) > m THEN
          m = Dat(k)
        END IF
    NEXT k
    PRINT m
    END
    Python:

    Dat = [0]*100
    N = 5
    m = S = 0
    for k in range(0, N):
        Dat[k] = int(input())
    for k in range(0, N):
        S += 2 * Dat[k]
        if Dat[k] > m:
            m = Dat[k]
    print(m)
    С++:

    #include <iostream> 
    using namespace std; 
     
    int main() {     
    int Dat[100];
    int N = 5;
    int k, m = 0, S = 0;
    for(k=0; k<N; k++)
       cin >> Dat[k];
    for(k=0; k<N; k++) {
       S += 2 * Dat[k];
       if (Dat[k]>m)
           m = Dat[k];
       }
    cout << m;
    return 0;
    }

    Ответ: 60

    Показать решение:

      Рассмотрим алгоритм.

    • В конце программы видим, что на экран выводится значение переменной m. То есть после выполнения всего алгоритма m станет равным 5. Запомним это.
    • Изначально переменная N равна значению 5:
    • В первом цикле формируются значения для пяти элементов массива:
    •   for k := 1 to N do      
          readln(Dat[k]);
    • Во втором цикле видим условие, в котором каждый из пяти элементов массива будет сравниваться с m. Если элемент больше m, то в m сохранится значение этого элемента:
    •    if  Dat[k]>m then
            begin
              m := Dat[k]
            end
    • Исходя из первого нашего пункта имеем, что наибольшее значение из пяти элементов массива – это значение 6. Так как в результате m = 6.
    • В цикле помимо условия находится сумматор, который суммирует 2 * Dat[k]. В задании необходимо определить наибольшее значение S, значит, выгодно, чтобы элементы массивов имели максимальное возможное значение.
    • Предположим, что все пять элементов массива равны 6. Тогда m после прохождения цикла останется равной 6. То есть результат будет верным.
    • Посчитаем S в цикле:
    • S := 0 + 2 * 6 + 2 * 6 + 2 * 6 + 2 * 6 + 2 * 6 = 12 * 5 = 60

    📹 Видео


    Добавить комментарий