КЕГЭ. Задача 17. Проверка на делимость

Условие

Рассматривается множество целых чисел, принадлежащих числовому отрезку [1016; 7937], которые делятся на 3 и не делятся на 7, 17, 19, 27. Найдите количество таких чисел и максимальное из них. В ответе запишите два целых числа без пробелов и других дополнительных символов: сначала количество, затем максимальное число. Для выполнения этого задания можно написать программу (Бейсик, Паскаль, С++, С#) или воспользоваться редактором электронных таблиц.

Решение

Несмотря на очевидную простоту, задача не решается тупым перебором за разумное время. Очевидно только, что искомые числа должны удовлетворять пяти условиям, а максимальное число должно быть последним из получаемой выборки. Вот эти решения:
C# (Visual Studio 2019}

using System;
namespace ConsoleApp
{
    class Program
    {
        static void Main()
        {
            int n, k, max;
            int n_min = 1016;
            int n_max = 7939;
            k = 0;
            max = 0;
            n = n_min;
            while (n <= n_max)
            { 
                if ((n % 3 == 0)
                    && !(n % 7 == 0) 
                    && !(n % 17 == 0) 
                    && !(n % 19 == 0) 
                    && !(n % 27 == 0))
                {
                    k++;
                    max = n;
                }
            n++;
            }
            Console.WriteLine(k);
            Console.WriteLine(max);
        }
    }
}

Ответ:
1568
7935

C++ (Visual Studio 2019}

#include <iostream>
using namespace std;
int main()
{
    int n, k, max;
    int n_min = 1016;
    int n_max = 7939;
    k = 0;
    max = 0;
    n = n_min;
    while (n <= n_max)
    {
        if ((n % 3 == 0)
            && !(n % 7 == 0)
            && !(n % 17 == 0)
            && !(n % 19 == 0)
            && !(n % 27 == 0))
        {
            k++;
            max = n;
        }
        n++;
    }
    cout << k << endl;
    cout << max << endl;
}

Ответ тот же, отличие - в операторе вывода.

Паскаль (PascalABC Net)

var n, k, max: integer;
begin
  n:=1016;
  k:=0;
  max:=0;
  while n<=7939 do
  begin 
    if (n mod 3 = 0) and not (n mod 7 = 0) 
      and not (n mod 17 = 0) and not (n mod 19 = 0)
      and not (n mod 27 = 0)
    then
      begin
        k:=k+1; 
        max:=n;
      end;
    n:=n+1;
  end;
  writeln(k);
  writeln(max);
end.

Ответ тот же.

Бейсик (Visual Basic (VB), Visual Studio 2019)

Module Module1
    Sub Main()
        Dim n, k, max, n_min, n_max As Integer
        n_min = 1016
        n_max = 7939
        k = 0
        max = 0
        n = n_min
        While n <= n_max
            If (n Mod 3 = 0) And Not (n Mod 7 = 0) And Not (n Mod 7 = 0) And Not (n Mod 19 = 0) And Not (n Mod 27 = 0) Then
                k = k + 1
                max = n
            End If
            n = n + 1
        End While
        Console.WriteLine(n)
        Console.WriteLine(max)
        Console.ReadKey()
    End Sub
End Module

Ответ тот же.
Замечание. В VB оператор Print n не поддерживается, заменен на Console.WriteLine(n).

 

4 комментария к “КЕГЭ. Задача 17. Проверка на делимость”

  1. Александр

    Это не про PascalABС.NET было, это код Turbo Pascal образца 1984 года. На PascalABC.NET это хотя бы вот так пишется (если комментарий пробелы съест — я не виноват):

    var (n, k, max) := (1016, 0, 0);
    while n <= 7939 do
    begin
      if (n mod 3 = 0) and not (n mod 7 = 0) 
          and not (n mod 17 = 0) and not (n mod 19 = 0)
          and not (n mod 27 = 0)
      then
      begin
        k += 1; 
        max := n;
      end;
      n += 1;
    end;
    Writeln(k, NewLine, max)
    
    1. Вячеслав Рычков

      Александр! Спасибо за Ваши комментарии по поводу версий языка.
      Имея в виду КЕГЭ и так как, пока не ясно какой там будет Паскаль, мы с ученицей писали, стараясь не полагаться на обратную совместимость версий.

  2. Александр

    Как я и думал, тег «` на форматирование не сработал. В продолжение темы. А на PascalABC.NET с версии 3.7.2. можно написать еще компактнее:

    var (k, max) := (0, 0);
    foreach var n in 1016..7939 do
      if n.Divs(3) and not n.DivsAny(7, 17, 19, 27) then
      begin
        k += 1; 
        max := n;
      end;
    Writeln(k, NewLine, max)
    1. Вячеслав Рычков

      У меня, например, стояла версия 3.2 от 21.01.2017. На ней инкремент k += 1; проходит, но старались его не использовать.
      Но вот в v.3.2 эти операторы еще не проходят.

        var (n, k, max) := (1016, 0, 0);
        foreach var n in 1016..7939 do
           if n.Divs(3) and not n.DivsAny(7, 17, 19, 27) then
      

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Пролистать наверх