Условие
Рассматривается множество целых чисел, принадлежащих числовому отрезку [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: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.
Как я и думал, тег «` на форматирование не сработал. В продолжение темы. А на PascalABC.NET с версии 3.7.2. можно написать еще компактнее:
У меня, например, стояла версия 3.2 от 21.01.2017. На ней инкремент k += 1; проходит, но старались его не использовать.
Но вот в v.3.2 эти операторы еще не проходят.
Это не про PascalABС.NET было, это код Turbo Pascal образца 1984 года. На PascalABC.NET это хотя бы вот так пишется (если комментарий пробелы съест — я не виноват):
Александр! Спасибо за Ваши комментарии по поводу версий языка.
Имея в виду КЕГЭ и так как, пока не ясно какой там будет Паскаль, мы с ученицей писали, стараясь не полагаться на обратную совместимость версий.