КЕГЭ. Задача 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).

 


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


Помощь проекту:

Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
4 комментариев
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Как я и думал, тег «` на форматирование не сработал. В продолжение темы. А на 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)
Важно: Вы можете поддержать проект и автора.

Это не про 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)
Важно: Вы можете поддержать проект и автора.
4
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x