Показаны сообщения с ярлыком Циклический алгоритм. Показать все сообщения
Показаны сообщения с ярлыком Циклический алгоритм. Показать все сообщения

20.10.2024

Программа "Угадай число" на языке Питон

Программа "Угадай число" – это интерактивная игра, в которой пользователю необходимо угадать случайно сгенерированное число. Основная идея заключается в том, чтобы предложить игроку ряд подсказок, основываясь на его попытках. 

Ход игры:

  1. Генерируем число в заданном диапазоне, например, от 1 до 100. 
  2. Обнуляем счетчик попыток a.
  3. Запускаем цикл while True
  4. Вводим предполагаемое число x
  5. Увеличиваем счетчик попыток на 1
  6. Осуществляем проверку

(если x строго меньше, сообщаем "Слишком мало! Попробуйте еще раз", иначе если x строго больше, то сообщаем "Слишком много! Попробуйте еще раз", в противном случае сообщаем "Поздравляем! Вы угадали число n за a попыток" и прерываем цикл оператором break.

Программа игры "Угадай число" на языке Python

import random

n = random.randint(1, 100) #сгенерировали случайное число в промежутке от 1 до 100.

a = 0 #попытки

print("Добро пожаловать в игру 'Угадай число'!")

print("Я загадал число от 1 до 100. Попробуй угадать его!")

while True:

    x = int(input("Введите ваше предположение: "))

    a += 1

    if x < n:

        print("Слишком мало! Попробуйте еще раз.")

    elif x > n:

        print("Слишком много! Попробуйте еще раз.")

    else:

        print(f"Поздравляю! Вы угадали число {n} за {a} попыток.") #форматированная f-строка

        break

Поиграем

Вот это повезло))

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

Попробуйте угадать число за минимальное количество попыток. И каково это количество?

О примененной в программе f-строке

Метод f"{}" в питоне, известный как f-строка, представляет собой мощный инструмент для форматирования строк, который был введён в языке программирования с версии Python 3.6. Он позволяет разработчикам интуитивно вставлять выражения в строковые литералы, что значительно упрощает код и делает его более читаемым.

Синтаксис f-строк включает префикс "f" перед открывающей кавычкой и фигурные скобки {}, в которые можно помещать выражения. Например, можно легко объединять текст с переменными: name = "Барсик" и строка f"Привет, {name}!" выведет "Привет, Барсик!".

Кроме того, f-строки поддерживают выражения и функции, что позволяет динамически вычислять значения прямо внутри строки. Например, f"Сумма: {a + b}" может выводить сумму двух переменных, не прибегая к дополнительным строкам кода. Метод f"{}" является не только элегантным, но и эффективным способом работы со строками в Python.

27.08.2024

Задачи на циклы (Питон, Паскаль)

Приведем решения задач на языках программирования Паскаль и Питон с применением операторов цикла.

Задача 1. Дана непустая последовательность целых чисел оканчивающаяся нулем. Найти сумму всех чисел.

Как будем решать задачу:

Количество чисел в последовательности не известно, но известно, что последнее вводимое число это 0.

  1. Примем сумму за 0 (переменная s).
  2. Введем первое число из последовательности (переменная x).
  3. Запустим цикл с условием продолжения: число x не равно 0.
  4. В теле цикла будем копить сумму чисел s и вводить число x.
  5. За циклом выведем сумму чисел на экран.

Программа решения задачи на языке Питон

s = 0

x = int(input())

while x!=0:

    s+=x

    x = int(input())

print('сумма чисел',s)

Результат запуска программы:

Программа решения задачи на языке Паскаль

var x,s:integer;

begin

  readln(x);

  s:=0;

  while x<>0 do

  begin

    s+=x;

    readln(x);

  end;

  print('сумма чисел',s);

end.

Задача 2. Найти сумму всех трехзначных четных чисел.

Пусть числа натуральные.

Будем решать задачу "в лоб".

  1. Примем сумму трехзначных четных чисел за 0.
  2. Запустим цикл с счетчиком n по промежутку трехзначных чисел (от 100 до 999)
  3. Проверим, кратно ли значение счетчика цикла n числу 2 (то есть, четно ли оно), если да, то будем копить сумму s.
  4. За циклом выведем искомую сумму чисел на экран.

Программа решения задачи на языке Питон

s = 0

for n in range(100,1000):

    if n % 2 == 0:

        s+=n

print('сумма трехзначных четных чисел',s)

Результат запуска программы

сумма трехзначных четных чисел 247050

Программа решения задачи на языке Паскаль

var n,s:integer;

begin

  s:=0;

  for n:=100 to 999 do

  begin

    if n mod 2 = 0 then s+=n;

  end;

  print('сумма трехзначных четных чисел',s);

end.

Как можно решить задачу быстрее?

Запустим цикл по заведомо четным числам, то есть от 100 до 999 с шагом 2 (100, 102, 104...), проверка четности числа не нужна.

В языке Питон

for n in range(100,1000,2):

    s+=n

В языке Паскаль

for n:=100 to 999 step 2 do

  begin

     s+=n;

  end;

Задачи на цикл в другой публикации.

20.11.2023

Срезы в PascalABC.NET (примеры использования в задачах)

Срез - это набор элементов списка, массива или строки.

Приведем в пример программу, демонстрирующую срезы в PascalABC.NET, а также решения задач с использованием срезов.

begin

  var a:=Arr(10, 11, 12, 13, 14, 15, 16, 17, 18);

  a.Println(); // вывод массива // [10, 11, 12, 13, 14, 15, 16, 17, 18]

  a[1:3].Println(); // срез по индексам [1, 3) с шагом 1 // [11, 12]

  a[2:8:3].println(); // срез по индексам [2, 8) с шагом 3 // [12, 15]

  a[7:2:-1].Println(); // срез по индексам [7, 2) с шагом -1 // [17, 16, 15, 14, 13]

  a[::-1].Println(); // реверс массива

 end.

 Задача 1. В массиве удалить каждый второй элемент.

  Пусть имеется массив [12, 13, 14, 15, 16]

  Результат [12, 14, 16]

begin

   var a:=Arr(12, 13, 14, 15, 16);

   a:=a[::2];

   a.Println();

end.

Задача 2. В массиве найти минимальный элемент среди элементов, у которых индексы кратны 3.

 Пусть имеется массив [100, 12, 14, 23, 45, 200, 27, 21]

 То есть среди элементов 100, 23, 27 найти минимальный.

begin

  var a:=Arr(100, 12, 14, 23, 45, 200, 27, 21);

  var m:=a[0::3].Min;

  println(m);

end.

Задача 3. В массиве удалить элемент с индексом k (k меньше количества элементов массива).

begin

  var a:=Arr(100, 12, 14, 23, 45, 200, 27, 21);

  var k:=random(a.Length);//k зададим случайно

  if k < a.Length-1 then a:=a[:k]+a[k+1:]

                     else a:=a[:a.Length-1];

  a.Println;

  println('удалили элемент с индексом ',k);

end.

Задача 4. В массив вставить элемент на место с индексом k (k меньше количества элементов массива).

begin

var a:=Arr(100, 12, 14, 23, 45, 200, 27, 21);

  var k:=random(a.Length);//зададим случайно

  setlength(a, a.Length);

  var d:=Random(100); //число зададим случайно

  if k < a.Length then a:=a[:k] + Arr(d) + a[k:]

                  else a:=a[:a.Length-1] + Arr(d);

  a.Println;

  println('вставили число ',d,' на место с индексом ',k);

end.


Динамические массивы в Паскале

Читать

Найти число пар соседних элементов массива, оканчивающихся нулем. Язык Паскаль.

Читать

Найти максимум/минимум в массиве. Программа на языке Паскаль.

Читать

Массивы в языке Паскаль. Решение задач. 8 класс (сумма, произведение, среднее арифметическое, минимум/максимум с условием)

Читать

Язык Паскаль. Найти количество различных чисел в массиве из N элементов (2 способа решения)

Читать

24.05.2023

Дано натуральное число N, есть ли в нем четная цифра. Язык Паскаль. PascalABC.NET

 В данной статье рассмотрим способы решения задачи о цифрах заданного натурального числа.

Задача. С клавиатуры вводится натуральное число N. Определить, есть ли в нем четные цифры?

Четные цифры это: 0, 2, 4, 6, 8

1 способ

f:=false;

while N<>0 do

 begin

  d:=N mod 10;

  if d in [0,2,4,6,8] then f:=true;

  N:=N div 10;

 end;

 if f then println('Да, четные цифры есть в числе') else println('Нет, четных цифр нет в числе');

За значение флага f приняли ЛОЖЬ - четных цифр нет в числе. Выделили цифры числа оператором цикла while. Если цифра принадлежит множеству четных цифр, то значение флага изменяем на ИСТИНУ.

За циклом осуществляется проверка флага. Если флаг принял значение ИСТИНА, то в числе есть четные цифры, в противном случае нет.

Комментарии

  • логическое значение ЛОЖЬ - false
  • логическое значение ИСТИНА - true
  • для хранения логических значений используются переменные типа boolean
  • оператор вхождения элемента в множество - in

Программа решения задачи на языке Паскаль

var N,d:integer;

    f:boolean;

begin

  print('Введите натуральное число N:');

  readln(N);

  f:=false;

  while N<>0 do

  begin

    d:=N mod 10;

    if d in [0,2,4,6,8] then f:=true;

    N:=N div 10;

  end;

  if f then println('Да, четные цифры есть в числе') else println('Нет, четных цифр нет в числе');

end.

Результат запуска программы


2 способ

Используем модуль School, функцию digits и методы динамических массивов.

С помощью функции digits получим список цифр числа, преобразуем список к массиву, найдем в полученном массиве четные цифры, преобразуем полученную последовательность в массив и вычислим его длину. Если длина полученного массива четных цифр не равна 0, то ответ Да, иначе Нет.

Программа решения задачи на языке Паскаль

uses school;

var N,p:integer;

begin

  print('Введите натуральное число N:');

  readln(N);

  p:=digits(N).ToArray.Where(k -> k in [0,2,4,6,8]).ToArray.Length;

  if p<>0 then println('Да, четные цифры есть в числе') else println('Нет, четных цифр нет в числе');

end.

Комментарии:

  • Условие k in [0,2,4,6,8] можно изменить на обычную проверку: остаток от деления на 2 равен 0? k mod 2 = 0
  • Данная программа является линейной и не использует цикл для выделения цифр числа.

3 способ

Преобразуем число в строку. Выполним проверку вхождения символов '0', '2', '4', '6', '8' в полученную строку.

Программа решения задачи на языке Python

n = int(input())

n = str(n) #функция str преобразует числовое значение в строковое

f = ('0' in n) or ('2' in n) or ('4' in n) or ('6' in n) or ('8' in n)

if f:

    print('yes')

else:

    print('no')


07.04.2023

Как инвертировать двоичный код. На примере задачи. Язык Паскаль. PascalABC.NET

 Задача. Автомат обрабатывает натуральное число N (1<=N<=255) по следующему алгоритму:

  • Строится восьмибитная двоичная запись числа.
  • Все цифры двоичной записи заменяются на противоположные (1 на 0, 0 на 1).
  • Полученное число переводится в десятичную запись.
  • Из нового числа вычитается исходное, полученная разность выводится на экран.

Какое число нужно ввести в автомат, чтобы в результате получилось 125?

В первую очередь разберемся, как инвертировать двоичную строку.

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

Пример:

s:='ОРИСОРИС';

s:=s.replace('РИС','ЛА');

Результат: s = ОЛАОЛА

Все подстроки РИС заменились на подстроки ЛА.

Тогда чтобы инвертировать двоичный код, нужно заменить все символы 1 на *, затем все символы 0 на символы 1, а затем все символы * на символы 0.

Пусть s = 101

1) все символы 1 заменим на *

s = *0*

2) все символы 0 заменим на 1

s = *1*

3) все символы * заменим на 0

s = 010

Сделаем это в одну строку:

s:=s.replace('1','*').replace('0','1').replace('*','0');

Как будем решать задачу

  • Запустим цикл по числам N
  • Выполним перевод числа N в двоичную систему счисления
  • Доведем разрядность двоичного кода до 8 (число восьмибитное)
  • Инвертируем полученное двоичное число
  • Выполним перевод полученной строки в десятичную систему счисления
  • Вычислим разность нового числа и исходного
  • Выполним проверку, если разность равна 125, то выводим число N на экран
Программа решения задачи на языке Паскаль

uses school;

var n,n1:integer; s,s1:string;

begin

 for n:=1 to 255 do

   begin

  s:=bin(n);

  s:='0'*(8-s.Length)+s;

  s1:=s.Replace('1','*').Replace('0','1').Replace('*','0');

  n1:=dec(s1,2);

  //println(s,s1);

  if n1-n=125 then println(n);

  end;

end.

Ответ: 65

14.03.2023

Найти число пар соседних элементов массива, оканчивающихся нулем. Язык Паскаль. PascalABC.NET

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

Задача. В массиве целых чисел из N элементов найти число пар соседних элементов массива, оканчивающихся нулем.

Пусть дан массив a из 5 элементов:

4, 10, 20, 80, 10

Все пары соседних элементов это:

4 и 10

10 и 20

20 и 80

80 и 10

Три пары соседних элементов, в которых оба числа оканчиваются на 0.

Если ввести нумерацию ячеек с 1, то обращение к парам будет таким:

a[1] и a[2]

a[2] и a[3]

a[3] и a[4]

a[4] и a[5]

Заметим, что всего пар соседних элементов четыре.

Если всего элементов в массиве будет 6, то пар будет 5.

В общем случае если число элементов массива N, то пар соседних элементов N-1.

Если ввести счетчик пар k, то обращение к парам будет таким:

a[k] и a[k+1]

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

for k:=1 to N-1 do

Как будем решать задачу

  • Сформируем массив целых чисел из N элементов случайным образом (возьмем диапазон от 10 до 30)
  • Выведем массив
  • Обратимся ко всем парам соседних элементов массива и будем узнавать, каждое ли число из пары оканчивается цифрой 0, если да, то будем копить счетчик искомых пар p.

if (a[k] mod 10 = 0) and (a[k+1] mod 10=0) then p:=p+1;

Публикация про последнюю цифру числа (читать).

Программа решения задачи на языке Паскаль

var a:array[1..100] of integer;

    k,p,N:integer;

begin

  print('Введите количество элементов массива:');

  readln(N);

  for k:=1 to N do

  begin

    a[k]:=random(10,30);

    print(a[k]);

  end;

  println;

  p:=0;

  for k:=1 to N-1 do

  begin

    if (a[k] mod 10 = 0) and (a[k+1] mod 10=0) then p:=p+1;

  end;

  print('количество пар соседних элементов, оканчивающихся цифрой 0:',p);

end.

Результат запуска программы

Пары соседних элементов массива, оканчивающихся цифрой 0

В нашем примере получилось две пары, это числа 10 и 10, 20 и 30.

Для проверки можно выводить все пары соседних элементов:

for k:=1 to N-1 do

  begin

    println(a[k],a[k+1]);

    if (a[k] mod 10 = 0) and (a[k+1] mod 10=0) then p:=p+1;

  end;

Пары соседних элементов массива

21.02.2023

Модуль School. PascalABC.NET. Функция isPrime

 Найдем количество простых чисел на промежутке [ 2 000 000, 10 000 000].

Воспользуемся функцией модуля School. Функция isPrime возвращает логическое True, если число простое.

Формат использования: n.isPrime

Программа решения задачи на языке Паскаль

uses school;

var n,p:integer;

begin

  p:=0;

  for n:=2000000 to 10000000 do

  begin

    if n.IsPrime then p+=1;

  end;

  print(p);

end.

Код выполнился за 17 секунд.

Количество простых чисел на промежутке чисел [2000000, 10000000] равно: 515646

Функция isPrime избавляет от необходимости писать код самостоятельно.

Приведем программу, которая ищет сразу два делителя для текущего числа n.

Программа решения задачи на языке Паскаль

var n,p,t,k:integer;

begin

  p:=0;

  for n:=2000000 to 10000000 do

  begin

    t:=0;

    for k:=2 to trunc(sqrt(n)) do

    begin

      if n mod k=0 then 

        if k<>n div k then t+=2

                      else t+=1;

         

    end;

    if t=0 then p+=1;

  end;

  print(p);

end.

Код выполнился примерно за 6 мин

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

20.01.2023

N-ая декартова степень множества элементов, заданного массивом (Cartesian). PascalABC.NET

Применим функцию Cartesian к решению задачи на комбинаторику.

Перевод Cartesian (англ.) декартовский.

Задача. Настя составляет коды из букв слова НАСТЯ. Код должен состоять из 7 букв, буква Н должна встречаться в нём ровно два раза, буква А – как минимум один раз. Сколько различных кодов может составить Настя? 

Для составления слов длины 7 Настя использует 5 различных букв. Количество таких слов будет равно:

5*5*5*5*5*5*5 = 57

Для вычисления такого произведения в PascalABC.NET используется функция Cartesian.

Зададим символьный массив c:

c:=Arr('Н','А','С','Т','Я')

Вычислим 7-ю декартову степень множества элементов, заданного массивом с:

c.Cartesian(7)

Циклом foreach x in c.Cartesian(7) do получим все символьные последовательности в виде массивов x. Склеим символы массива x  в строку s:=x.JoinToString.

Выполним проверку условий и подсчитаем количество искомых слов.

Программа решения задачи на языке Паскаль

var c,x:array of char;  

    s:string;

    k:integer;

begin

  c:=Arr('Н','А','С','Т','Я');

  k:=0;

  foreach x in c.Cartesian(7) do

  begin

    s:=x.JoinToString;

    if (s.CountOf('Н')=2) and (s.CountOf('А')>=1) then k+=1;

  end;

  print(k);

end.

Ответ: 16401 

Демонстрация работы функции Cartesian

var c,x:array of char;  

    s:string;

begin

  c:=Arr('Т','О','К');

  foreach x in c.Cartesian(4) do

  begin

    s:=x.JoinToString;

    print(s,',');

  end;

end.

Вывод:

ТТТТ , ТТТО , ТТТК , ТТОТ , ТТОО , ТТОК , ТТКТ , ТТКО , ТТКК , ТОТТ , ТОТО , ТОТК , ТООТ , ТООО , ТООК , ТОКТ , ТОКО , ТОКК , ТКТТ , ТКТО , ТКТК , ТКОТ , ТКОО , ТКОК , ТККТ , ТККО , ТККК , ОТТТ , ОТТО , ОТТК , ОТОТ , ОТОО , ОТОК , ОТКТ , ОТКО , ОТКК , ООТТ , ООТО , ООТК , ОООТ , ОООО , ОООК , ООКТ , ООКО , ООКК , ОКТТ , ОКТО , ОКТК , ОКОТ , ОКОО , ОКОК , ОККТ , ОККО , ОККК , КТТТ , КТТО , КТТК , КТОТ , КТОО , КТОК , КТКТ , КТКО , КТКК , КОТТ , КОТО , КОТК , КООТ , КООО , КООК , КОКТ , КОКО , КОКК , ККТТ , ККТО , ККТК , ККОТ , ККОО , ККОК , КККТ , КККО , КККК 

Всего таких слов: 34 = 81

16.12.2022

Задание 12. ЕГЭ по информатике. Редактор. Статград 25.10.22

Дана программа для редактора:

НАЧАЛО

ПОКА НЕ нашлось (00)

заменить (011, 20)

заменить (022, 10)

заменить (01, 220)

заменить (02, 110)

КОНЕЦ ПОКА

КОНЕЦ

Известно, что исходная строка A содержала ровно два нуля – на первом и на последнем месте, а также поровну единиц и двоек. После выполнения данной программы получилась строка B, содержащая 40 единиц и больше 50 двоек. Какое наименьшее количество двоек может быть в строке B?

! Ошибка. Решение перебором ищем! Нужно проанализировать, как меняются подстроки в соответствии с алгоритмом. Например, подстрока 1112 меняется на 22211. Остается только подобрать количество 1 и 2. 

Решение подбором (Phyton)

Решение системой уравнений (Phyton)


13.11.2022

Язык Паскаль. Автомат обрабатывает натуральное число N > 1. Для скольких значений N в результате работы алгоритма получится число, принадлежащее отрезку [150; 200]?

 Задача. Автомат обрабатывает натуральное число N > 1 по следующему алгоритму:

1. Строится двоичная запись числа N.

2. В конец записи (справа) дописывается вторая справа цифра двоичной записи.

3. В конец записи (справа) дописывается вторая слева цифра двоичной записи.

4. Результат переводится в десятичную систему.

Пример. Дано число N = 11. Алгоритм работает следующим образом:

1. Двоичная запись числа N: 1011.

2. Вторая справа цифра 1, новая запись 10111.

3. Вторая слева цифра 0, новая запись 101110.

4. Результат работы алгоритма R = 46.

Для скольких значений N в результате работы алгоритма получится число, принадлежащее отрезку [150; 200]?

Как будем решать задачу?

Будем искать число N, для которого результат работы алгоритма будет принадлежать отрезку [150; 200].

Обнулим искомый счетчик чисел r:=0.

Запустим цикл по подбираемым числам (по условию задачи это числа, больше 1, правую границу возьмем за 100, эту границу можно подбирать): 

for k:=2 to 100 do

За число N возьмем значение k.

Выполним перевод числа N в двоичную систему счисления: для этого пока число не равно 0, вычислим остаток от деления на 2 (это двоичная цифра), число уменьшим нацело в 2 раза. Чтобы получить двоичный код, превратим цифру n mod 2 в строку d процедурой str(n mod 2, d), и накопим строку s - это и будет двоичный код числа N, причем будем к вновь полученной цифре добавлять строку, тогда цифры двоичного кода будут получены в правильном порядке:

s:=d + s;

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

s:=s+s[length(s)-1]+s[2];

Далее проверим, принадлежит ли полученный двоичный код результата диапазону чисел [150, 200].

Мы знаем, что числа из данного промежутка имеют длину 8 в двоичной коде, поэтому сравним принадлежность отрезку условием:

(length(s)=8) and (s>='10010110') and (s<='11001000')

Двоичный код числа 150 - это 10010110, а двоичный код числа 200 - это 11001000.

Если условие ИСТИНА, накопим искомый счетчик чисел r, также можно вывести само подходящее число N (это значение счетчика k, значение самой переменной N равно 0 из-за выполненного перевода).

Такую проверку осуществить быстрее, чем переводить полученную строку в десятичное значение.

Программа решения на языке Паскаль

var s,d:stringn,k,r:integer;

  begin

    r:=0;

    for k:=2 to 100 do

    begin

      n:=k; s:='';

      while n<>0 do

      begin

        str(n mod 2,d);

        s:=d+s;

        n:=n div 2;

      end;

      s:=s+s[length(s)-1]+s[2];

      if (length(s)=8)and(s>='10010110')and(s<='11001000')

          then begin print(k); r:=r+1; end;

    end;

    println('Количество чисел:',r);

  end.

Результат запуска программы

Результат запуска

Ответ к задаче: 12 чисел

Способ 2 (используем модуль School и функции bin и dec)

Будем использовать функцию bin из модуля School для перевода числа в двоичную систему счисления, результатом будет строка двоичных цифр.

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

Программа решения задачи на языке Паскаль

uses School;

var N,R,Kol:integer; B:string; 

  begin

    for N:=2 to 100 do

    begin

      B:=bin(N);

      B:=B+B[length(B)-1]+B[2];

      R:=dec(B,2);

      if R in [150..200] then Kol+=1;

    end;

    println(Kol);

  end.



30.09.2022

Язык Паскаль. Циклический алгоритм. Решение задач. 8 класс

В этой публикации рассмотрим решение некоторых задач по теме "Циклический алгоритм".

Задача 1. С клавиатуры вводится N натуральных чисел. Найти количество чисел, оканчивающихся на 3.

Как будем решать задачу

Воспользуемся оператором цикла с счетчиком для ввода N чисел.

for k:=1 to N do

begin

readln(a);

end;

Чтобы узнать, оканчивается ли число на 3, воспользуемся операцией mod (целый остаток от деления).

Пусть число a=463.

Последнюю цифру вычислим так: a mod 10.

Действительно, 463 mod 10 равно 3.

Будем копить количество чисел (переменная p), оканчивающихся на 3, оператором:

if a mod 10 = 3 then p:=p+1;

Программа решения задачи на языке Паскаль

var k, N, p, a:integer;

begin

   writeln('Введите количество чисел N ');

   readln(N);

   p:=0;

   for k:=1 to N do

   begin

     writeln('Введите натуральное число ');

     readln(a);

    if a mod 10 = 3 then p:=p+1;

   end;

   writeln('Количество чисел, оканчивающихся на 3 равно ',p);

end.

Результат запуска программы

Результат запуска

А что, если бы числа были не натуральные, а целые (как отрицательные, так и положительные), изменилось бы условие в операторе if?

Задача 2. С клавиатуры вводится N целых чисел. Найти среднее арифметическое двузначных чисел.

Как будем решать задачу

Воспользуемся оператором цикла с счетчиком для ввода N чисел.

for k:=1 to N do

begin

readln(a);

end;

Как узнать двузначное перед нами число или нет. Приведем примеры целых двузначных чисел: 23, -34, -99, 55.

Таким образом, минимальное двузначное положительное число это 10, а максимальное 99. 

Минимальное отрицательное двузначное число это -99, а максимальное -10.

двузначные числа

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

(a>=10) and (a<=99) or (a>=-99) and (a<=-10)

то есть число отрицательное двузначное или положительное двузначное.

Ранее в этом блоге мы рассматривали способы проверки такого условия. Читайте статью "Как проверить, является ли число двузначным".

Если число a двузначное, то будем копить сумму s и количество p таких чисел (будем использовать операторные скобки для объединения этих двух действий).

Программа решения задачи на языке Паскаль

var k, N, p, a, s:integer; sr:real;

begin

   writeln('Введите количество чисел N ');

   readln(N);

   p:=0; s:=0;

   for k:=1 to N do

   begin

     writeln('Введите целое число ');

     readln(a);

     if (a>=10) and (a<=99) or (a>=-99) and (a<=-10) then 

      begin

        p:=p+1;

        s:=s+a;

      end;

   end;

   sr:=s/p;

   writeln('Среднее значение равно ',sr);

end.

Результат запуска программы

Результат запуска

А что, если ни одного двузначного числа мы не введем, что выведет программа?



28.07.2022

Язык Паскаль. Наибольший общий делитель двух натуральных чисел НОД(m,n)

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

  • алгоритме Евклида
  • перебора возможных делителей числа
  • разложения чисел на простые множители

Что такое наибольший общий делитель двух натуральных чисел m и n, или НОД(m, n)

НОД двух натуральных чисел - это такое наибольшее натуральное число, которое одновременно делит без остатка оба этих числа.

Алгоритм Евклида

Евклид - древнегреческий математик, геометр, автор первого из дошедших до нас теоретических трактатов по математике.

Алгоритм Евклида - один из наиболее ранних численных алгоритмов в истории. Евклид впервые дал описание этого алгоритма в книгах «Начала». Изначально этот алгоритм назывался «взаимным вычитанием», так как его принцип заключался в последовательном вычитании из большего числа меньшего, пока в результате не получится ноль.

Сформулируем алгоритм

Пусть даны два натуральных числа m и n. Пока числа m и n не равны (или их разница не равна 0), большее число заменить их разницей. В качестве ответа взять любое из чисел.

Пример:

Пусть m = 12, n = 18

12<>18, n = 18 - 12 = 6

12<>6, m = 12 - 6 = 6

6<>6, НОД(12, 18) = 6

Программа на языке программирования Паскаль (алгоритм Евклида)

var m, n:integer;

begin

  writeln('Введите два натуральных числа m и n:');  

  readln(m,n);

  while m<>n do

  begin

    if m>n then m:=m-n

           else n:=n-m;

  end;

  writeln('НОД(m,n): ',m);

end.

Результат запуска программы

Результат запуска программы

Перебор возможных делителей числа

Будем использовать алгоритм, разобранный ранее в этом блоге.

Запустим цикл for с счетчиком k от 1 до n, будем проверять условие: если число n делится на значение счетчика k без остатка (n mod k = 0), то значение счетчика k - это делитель числа n, значение k можно вывести на экран или сохранить в отдельной переменной.

Поскольку нам нужен наибольший общий делитель чисел m и n, поэтому запустим цикл до минимального из чисел m и n (другое будет лишним), и будем проверять условие: если число m делится на значение счетчика цикла k без остатка и число n делится на значение счетчика цикла k без остатка одновременно (воспользуемся операцией and), это и будет их общий делитель.

Программа на языке программирования Паскаль (перебор возможных делителей числа)

var m, n, k, p:integer;

begin

  writeln('Введите два натуральных числа m и n:');

  readln(m,n);

  for k:=1 to min(m,n) do 

  begin

    if (m mod k = 0) and (n mod k=0) then p:=k;

  end;

  writeln('НОД(m,n): ',p);

end.

Функция min будет работать в PascalABC.NET, в случае использования другой среды, нужно до цикла определить наибольшее число из m и n.

Разложение чисел на простые множители

Ранее мы разбирали алгоритм разложения натурального числа на простые множители

Как связаны простые множители числа и НОД. Приведем пример.

Пусть m = 18,  n = 12

Выполним разложение на простые множители.

Множители числа m: 2 3 3

Множители числа n: 2 2 3

Выделим их общие простые множители - это числа 2 и 3. В качестве наибольшего общего делителя нужно взять из произведение: 2 * 3 = 6. НОД(12, 18) = 6.

Пусть m = 36,  n = 48

Множители числа m: 2 2 3 3

Множители числа n: 2 2 2 2 3

Общие простые множители - это числа 2 2 3. Произведение этих множителей равно 12. НОД(36, 48) = 12.

Для нахождения НОД двух чисел нужно выполнить их разложение на простые множители и в качестве ответа взять произведение их общих множителей.

Как будем решать задачу

Для хранения множителей числа воспользуемся списком (PascalABC.NET), в него легко добавлять значение командой add.

Описание списка с именем nod в блоке var

var nod:List<integer>;

Создание нового пустого списка в теле программы

nod:=new List<integer>;

Добавление значения в конец списка

nod.add(значение);

Создадим два списка (s1 и s2) для хранения множителей числа m и n соответственно. С помощью конструкции вложенных циклов переберем все элементы списков и сравним на равенство, если множители равны, сохраним их в списке nod, а значения элементов списков сделаем равными -1 и -2 соответственно (чтобы далее их повторное сравнение на равенство было ложным) . В качестве ответа возьмем произведение элементов списка nod командой nod.Product.

Программа на языке программирования Паскаль (разложение чисел на простые множители)

var

  m, n, k1, k2: integer;      

  s1, s2, nod: List<integer>;


begin

  writeln('Введите два натуральных числа m и n:');   

  readln(m, n);  

  s1 := new List<integer>; 

  s2 := new List<integer>; 

  nod := new List<integer>;

  k1 := 2; k2 := 2;  

  while (m > 1) or (n > 1) do   

  begin

    while m mod k1 = 0 do     

    begin

      m := m div k1;      

      s1.Add(k1); //добавить значение в список можно и так: s1+=k1;

    end;     

    k1 += 1;     

    while n mod k2 = 0 do    

    begin

      n := n div k2;       

      s2.Add(k2);     

    end;     

    k2 += 1;   

  end;   

  //writeln(s1, s2); 

  for k1:=0 to s1.Count-1 do //элементы списка нумеруются с 0, длина списка s1.count

    for k2:=0 to s2.Count-1 do

      if s1[k1]=s2[k2] then //s1[k1] - обращение к элементу списка по его номеру

        begin 

        nod.Add(s1[k1]);

        s1[k1]:=-1;

        s2[k2]:=-2;

        end;

  //println(s1,s2,nod);

  println('НОД(m,n): ',nod.Product);

end.

Это программа состоит из самого большого количества строк. Насколько она эффективна?

Задача на применение НОД

Даны числа: a = 23 • 310 • 5 • 72 , b = 25 • 3 • 11. Чему равен  НОД (a,b)?

29.06.2022

Язык Паскаль. Найти наибольшую длину возрастающей подпоследовательности

 Задача. С клавиатуры вводится набор N целых чисел. Найти наибольшую длину возрастающей подпоследовательности.

Пример

N = 10

10 11 20 3 9 27 100 10 5 4

Наибольшая длина: 4

В этом ряду возрастающих подпоследовательностей две: числа 10 11 20 и 3 9 27 100. Наибольшая длина - 4, четыре числа в подпоследовательности 3 9 27 100.

Как будем решать задачу

Введем N - количество чисел в наборе.

Введем с клавиатуры первое число a и за длину возрастающей подпоследовательности возьмем k = 1. За искомую максимальную длину возьмем m = 1.

Далее в цикле для t от 2 до N:

  1. введем число b
  2. выполним проверку b>a, если условие истинно, то значение k увеличим на 1 (считаем длину возрастающей подпоследовательности), иначе значением k возьмем за 1 (возрастающая подпоследовательность оборвалась)
  3. найдем максимальную длину m
  4. значение переменной a перезапишем на значение b

Таблица выполнения алгоритма

a

b

b > a

k

k > m

m

10

 

 

1

 

1

11

11

11 > 10 да

2

2 > 1 да

2

20

20

20 > 11 да

3

3 > 2 да

3

3

3

3 > 20 нет

1

1 > 3 нет

 

9

9

9 > 3 да

2

2 > 3 нет

 

27

27

27 > 9 да

3

3 > 3 нет

 

100

100

100 > 27 да

4

4 > 3 да

4

10

10

10 > 100 нет

1

1 > 4 нет

 

5

5

5 > 10 нет

1

1 > 4 нет

 

4

4

4 > 5 нет

1

1 > 4 нет

 

 

 

 

 

 

Вывод 4

Программа решения задачи на языке Паскаль

var a,b,k,m,t,N:integer;

begin

  readln(N);

  read(a); k:=1; m:=1;

  for t:=2 to N do

  begin

    read(b);

    if b>a then k+=1 else k:=1;

    m:=max(k,m); //функция нахождения максимума из двух значений

    a:=b;

  end;

  writeln('наибольшая длина возрастающей подпоследовательноси: ',m);

end.

Результат запуска программы

Результат запуска программы