Кратное 3 и 5

Передняя Материя

Вот и мы, пытаемся решить проблемы программирования с помощью Dark Souls. Сегодня мы начнем с довольно простой задачи: получить значения, кратные 3 и 5.

Задача 1: умножение на 3 и 5

Если мы перечислим все натуральные числа ниже 10, которые кратны 3 или 5, мы получим 3, 5, 6 и 9. Сумма этих кратных 23.

Найдите сумму всех кратных 3 или 5 под заданным значением параметра number.

Версия видео

Если вам нравится смотреть, а не читать, посмотрите видео, которое прилагается к этой статье. Если нет, продолжайте читать!

Решение

На первый взгляд это кажется более сложным, чем есть на самом деле. В целях обучения я буду как можно более подробным, а потом сделаю рефакторинг.

Разбор проблемы на простом английском

Важно разбить все элементы проблемы, чтобы мы полностью понимали, что пытаемся сделать.

Натуральное число

целые положительные числа (целые числа) 1, 2, 3 и т. д., а иногда и ноль.

Кратное x

Когда мы говорим,

«6 кратно 3?»

мы спрашиваем,

«это 6 число, которое можно вычислить, умножив 3 на число (в нашем случае целые числа)»

В данном случае да, 3 х 2 = 6.

Шаги

Теперь, когда мы понимаем нашу проблему, давайте сделаем несколько логических утверждений.

  1. Учитывая число, посмотрите, кратно ли оно трем.
  2. Если это правда, добавьте его к общему числу.
  3. Учитывая число, посмотрите, кратно ли оно 5
  4. Если это правда, добавьте его к общему числу.

Давайте разберемся в коде. Опять же, это очень многословно.

function multiplesOf3and5(number) {
	// establish a global total and set initial value to 0
	let total = 0
	// loop through all values from 0 to given number	
  for(let i = 0; i <= number; i++) {
		// Get remainder of i and 3
		let remainderFor3 = i % 3;
		// Get remainder of i and 5
		let remainderFor5 = i % 5;
		// check if remainder for 3 or 5
		if(remainderFor3 == 0 || remainderFor5 == 0) {
			// If true, that means i is a multiple of 3
			// add it to the total
			total = total + i
		}
	}
	// return our total number
	return total
}

Объяснение Modulo %

Эта строка делает кое-что интересное:

i % 3

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

Рефакторинг

Мы можем значительно сократить код, не теряя контекста того, что мы пытаемся сделать. Вот мое окончательное решение.

function multiplesOf3and5(number) {
  let total = 0;
  for (let i = 0; i <= number; i++) {
    if (i % 3 == 0 || i % 5 == 0) {
      total += i;
    }
  }
  return total;
}

Последние мысли

Всегда есть возможности для улучшения, однако мне нравится, как это устроено. Это просто и не слишком абстрагируется от того, чего мы пытаемся достичь. Я уверен, что если я вернусь к этому через два года, я все равно буду знать, что происходит.

Если вы хотите увидеть код, ознакомьтесь с моим репозиторием на Github с проблемами, которые я решил до сих пор.

DarthOstrich / projectEuler

Проблема 2

Ознакомьтесь с моим решением проблемы 2 здесь:



Ресурсы

Представляем # ProjectEuler100 Challenge:« Темные души достижений в программировании»