Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 26.08.2023
Сообщений: 7

Являются ли значения М и N кратными трем

26.08.2023, 01:35. Показов 2026. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Нужен максимально короткий код на C++ с объяснением каждой строки кода.
Вот задача: Определить, являются ли значения целочисленных переменных М и N кратными трем. Если оба кратны трем, то вычислить их сумму, иначе вычислить их произведение.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.08.2023, 01:35
Ответы с готовыми решениями:

Определить являются ли значения целочисленных переменных кратными трем
Определить являются ли значения целочисленных переменных А и В кратными трем. Если оба кратны трем, то вычислить их сумму, иначе вычислить...

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

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

31
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6331 / 3063 / 1054
Регистрация: 01.06.2021
Сообщений: 11,698
26.08.2023, 21:24
Студворк — интернет-сервис помощи студентам
SmallEvil, видимо, повар1 применил правило "если два числа делятся на 3, то их сумма тоже делится на 3" в обратном порядке, что неверно. Это логическая ошибка. Когда идёт дождь - асфальт мокрый. Но если асфальт мокрый - не факт, что идёт дождь)
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
26.08.2023, 21:40
Передаём числа как аргументы командной строки:
C++
1
2
3
#include <iostream>
#include <cstdlib>
int main(int argc, char const *argv[]) { if (int m = (argc > 2 ? atoi(argv[1]) : 0), n = (argc > 2 ? atoi(argv[2]) : 0); m) std::cout << (m % 3 || n % 3 ? m * n : m + n) << '\n'; }
Под линуксом запускал так:
Bash
1
g++ -std=c++17 main.cpp && ./a.out 6 2
Результат:
12
Bash
1
g++ -std=c++17 main.cpp && ./a.out 6 3
Результат:
9

Этот вариант самый короткий, который я смог придумать - три строки всего.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6331 / 3063 / 1054
Регистрация: 01.06.2021
Сообщений: 11,698
26.08.2023, 21:43
Цитата Сообщение от sourcerer
Этот вариант самый короткий, который я смог придумать - три строки всего.
Насколько мне известно, в С++ любой код можно написать в одну строку. Поэтому нужно считать количество символов, а не строк.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
26.08.2023, 21:46
Royal_X, два стейтмента на одной строке - признак плохого кода. У меня получается один compound statement на одной строке. Такой код, конечно, изящным не назовёшь, но ТС хотел как можно короче. В принципе, если пренебречь правилом один стейтмент - одна строка, то можно ещё короче:
C++
1
2
#include <iostream>
int main(){ int m = 6, n = 3; std::cout << (m % 3 || n % 3 ? m * n : m + n) << '\n'; }
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
26.08.2023, 21:52
Лучший ответ Сообщение было отмечено Royal_X как решение

Решение

Если у нас драка за каждый символ, то можно даже так:
C++
1
2
#include<iostream>
int main(){int m=6,n=3;std::cout<<(m%3||n%3?m*n:m+n);}
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
26.08.2023, 22:39
Цитата Сообщение от sourcerer Посмотреть сообщение
Если у нас драка за каждый символ, то можно даже так
Ну вот, приехали, а было так красиво и понятно, на удивление (в посте 17).
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
26.08.2023, 22:45
Цитата Сообщение от SmallEvil Посмотреть сообщение
Ну вот, приехали, а было так красиво и понятно, на удивление (в посте 17).
SmallEvil, ну что тут скажешь? Есть несколько вариантов. Кому какой нравится, тот такой себе и утащит.
0
0 / 0 / 0
Регистрация: 26.08.2023
Сообщений: 7
27.08.2023, 20:24  [ТС]
sourcerer, у вас самый маленький код а пояснения? Если можете можно ещё меньше?

Добавлено через 22 секунды
Ребята можете пояснить для новичка что такое плохой код?
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
27.08.2023, 22:16
Toyota Camry, пояснения другие уже дали. У меня всё то же самое, те же операторы.
0
0 / 0 / 0
Регистрация: 26.08.2023
Сообщений: 7
27.08.2023, 22:51  [ТС]
sourcerer, у вас чёто и код не работает.

Добавлено через 25 секунд
Вот этот:
C++
1
2
#include<iostream>
int main(){int m=6,n=3;std::cout<<(m%3||n%3?m*n:m+n);}
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
27.08.2023, 23:11
Toyota Camry, всё превосходно работает: https://onlinegdb.com/A60jpB8vL
Заменяйте в коде значения переменных m и n на те, которые нужны Вам, будет разный результат. А так - всё время будет складываться 6 и 3, потому что и 6 и 3 кратны трём, а значит складываем их - получаем 9.

Добавлено через 5 минут
Toyota Camry, по сути код из сообщения #25 представляет из себя вот такой код, просто записанный в одну строчку:
C++
1
2
3
4
5
6
#include <iostream>
int main()
{
    int m = 6, n = 3;
    std::cout << (m % 3 || n % 3 ? m * n : m + n);
}
Первая строка - это так называемая директива препроцессора (preprocessor directive). Каждая директива препроцессора начинается со знака решётки. Этой директивой мы подключаем заголовочный файл iostream. Собственно, include - английское слово, означающее "включить". Заголовочный файл iostream - это один из множества файлов стандартной библиотеки языка С++. Директива препроцессора include позволяет нам "включить" в наш файл библиотечный файл iostream. Этот процесс очень похож на обычную пару операций копировать/вставить. Представьте, что вместо этой одной строки в Вашем файле оказываются сотни строк библиотечного кода, написанного умными дядями задолго до Вас, и оттестированного миллионами пользователей. Нам этот заголовочный файл нужен для того, чтобы в нашем коде стали доступны определения библиотечных объектов std::cout и std::cin.
Библиотечный объект cout (произносится как "си-аут") - это сокращение от "character output" (по другой версии - от "console output"), то есть, "символьный вывод" или "консольный вывод". Этот объект определён где-то в недрах библиотечного файла iostream. Библиотечный объект cout знает, как выводить на консоль переменные фундаментальных типов (fundamental types) или как их ещё называют, встроенных типов (built-in types). Таким образом, Вам не приходится заботится о том, чтобы самостоятельно реализовывать эту функциональность - она уже доступна в виде готового библиотечного решения. Вы просто используете объект cout, а он выводит на консоль всё, что Вы в него закидываете.
Библиотечный объект cin (произносится как "си-ин") - это сокращение от "character input" (по другой версии - от "console input"), то есть "символьный ввод" или "консольный ввод". Этот объект позволяет осуществлять пользовательский ввод с устройства ввода (в нашем случае - с клавиатуры) и сохранять его в переменную.
Функция main - это точка входа в программу. Именно эту функцию вызывает операционная система, когда вы кликаете на иконку с Вашей программой или вызываете Вашу программу из командной строки. Слово main - с английского "главная". Функция main как и другие функции в языке С++ имеет чётко определённый синтаксис: сперва мы пишем тип возвращаемого значения (int - от английского "integer" - целое число). Функция main в самом конце своего выполнения вернёт вызывающей стороне (операционной системе) значение целого типа. Обычно это достигается выполнением инструкции return (return statement), и выглядит это так:
C++
1
2
3
4
5
6
7
#include <iostream>
int main()
{
    int m = 6, n = 3;
    std::cout << (m % 3 || n % 3 ? m * n : m + n);
    return 0;
}
Но функция main отличается от других функций тем, что если Вы явно не предоставите в самом конце инструкцию return, она будет подставлена туда компилятором. Поэтому, эту инструкцию мы можем опустить - всё равно компилятор позаботится, чтобы она там была. Любая функция возвращает поток управления вызывающей стороне. Но если функция не void, то она возвращает ещё и возвращаемое значение - в случае с функцией main, это ноль. Ноль - признак успешного завершения программы.
Около имени каждой функции (в случае, если мы говорим об определении функции) можно увидеть пару круглых скобок - это так называемый call operator. Внутри круглых скобок располагается список параметров (parameter list). В нашем случае список параметров пуст, то есть, это значит, что мы не передаём внутрь функции main никаких параметров, однако, Вы могли заметить, что в одном из предыдущих примеров я передавал в функцию main пару параметров. Обе этих формы (без параметров и с двумя параметрами) установлены стандартом языка С++.
Пара фигурных скобок представляет из себя тело функции (function body). Внутри тела функции располагаются инструкции (statements). Каждая законченная инструкция в языке программирования С++ заканчивается точкой с запятой (за исключением так называемых compound statements, но о них мы сейчас говорить не будем). Таким образом, в нашем примере выше три инструкции:
C++
1
2
3
int m = 6, n = 3; // объявление двух целочисленных переменных и инициализация их значениями 6 и 3
std::cout << (m % 3 || n % 3 ? m * n : m + n); // вывод на экран результата вычисления выражения (m % 3 || n % 3 ? m * n : m + n)
return 0; // возврат вызывающей стороне значения 0
Как Вы скорее всего заметили, перед объектом cout мы пишем идентификатор std и затем два двоеточия. std (или как на конференциях по С++ говорят "студ") - это имя стандартного пространства имён (namespace std). Все классы, функции, константы, объекты стандартной библиотеки помещены в пространство имён std. Это сделано для того, чтобы избежать конфликтов имён. Поскольку хороших имён ограниченное количество, может возникнуть ситуация, когда Вы и, скажем, разработчик сторонней библиотеки, использовали одно и то же имя. Не будь неймспейсов, компилятор не смог бы разобраться, какая именно сущность имеется ввиду - Ваша или библиотечная. Два двоеточия - это оператор разрешения контекста (scope resolution operator).
Рядом с объектом cout Вы могли заметить два знака меньше << - это так называемый оператор вставки в поток (insertion operator) или, как его называет в своей книге Стенли Липпман - оператор вывода (output operator). Этот оператор позволяет закинуть в объект cout результат вычисления выражения (m % 3 || n % 3 ? m * n : m + n)
В этом выражении используется условный оператор ?: или, как его ещё называют, тернарный оператор. Его синтаксис прост:
(условие) ? (если условие истинно, выполняем это выражение) : (если условие ложно, выполняем это выражение)
Результат вычисления выражения можно присвоить переменной или, как в нашем случае, закинуть в объект cout, чтобы вывести на консоль.
В качестве условия у нас выражение m % 3 || n % 3
Здесь мы используем оператор взятия остатка от целочисленного деления (значок процента). Если то, что лежит в переменной m (в нашем случае мы положили туда шестёрку, помните?) поделить на 3, то остаток будет ноль. То же верно и для n (мы сложили в неё значение 3). Получается, в обеих частях этого выражения у нас нули. А ноль в С++ в случае логических вычислений - это false. Выражение m % 3 || n % 3 - это и есть такое логическое выражение. Для его вычисления применяется оператор логического ИЛИ (logical OR operator) - это вот те самые две вертикальные палочки (в английской литературе их называют ещё pipe). Оператор || работает так: если хотя бы одна из частей (левая или правая) выражения x || y истинна (true), то всё выражение истинно, в противном случае, всё выражение ложно (false). А мы уже выяснили, что наше выражение m % 3 || n % 3 в случае m равной 6 и n равной 3 и в правой и в левой части ложно. Следовательно, вычисляться будет та ветка, которая после двоеточия, то есть m + n.
Запись с тернарным оператором короче, но может немного сбивать с толку начинающего. По сути, чтобы повысить читаемость кода, мы могли бы записать всё, что у нас в теле функции main вот таким образом:
C++
1
2
3
4
5
6
7
8
9
int m = 6, n = 3;
if (m % 3 || n % 3) // если m не кратно трём ИЛИ n не кратно трём, то
{
    std::cout << m * n; // вывести на консоль произведение
}
else // иначе 
{
    std::cout << m + n; // вывести на консоль сумму
}
Подробнее про все эти термины и концепции можно либо нагуглить, либо почитать в учебнике Стивена Праты или учебнике Стенли Липпмана. Если бы Вы спросили моего совета, я бы посоветовал почитать как минимум первые девять глав из учебника Стивена Праты. Я думаю, за два-три месяца вполне реально прочитать и усвоить с полного нуля то, что там написано (если ежедневно заниматься по два-три часа).
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
28.08.2023, 09:18
Цитата Сообщение от Toyota Camry Посмотреть сообщение
Если можете можно ещё меньше?
Toyota Camry, ещё меньше не могу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.08.2023, 09:18

Определить, являются ли значения целочисленных переменных N и M кратными 3.
Определить, являются ли значения целочисленных переменных N и M кратными 3. Если оба значения кратны 3, то вычислить их сумму, в противном...

Вывести на экран числа с индексами, кратными трем
Даны целые числа, вывести на экран числа с индексами, кратными трем.

Переписать в новый массив все элементы с порядковыми номерами, кратными трем
Дан целочисленный массив A размера N. Переписать в новый целочисленный массив B все элементы с порядковыми номерами, кратными трем (3, 6,...

Подсчитать количество цифровых символов в строке с кодами ASCII кратными трем.
Подсчитать количество цифровых символов в строке с кодами ASCII кратными трем. тут есть такая тема. но она без ответная чото!

Подсчитать количество цифровых символов в строке с кодами ASCII кратными трем
1)Подсчитать количество цифровых символов в строке с кодами ASCII кратными трем. 2)Дана строка. Преобразовать ее, заменив каждый...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru