Математические манипуляции с числами

Рассмотрим базовые математические манипуляции с числами: подсчет цифр в числе, обратная перестановка, палиндром и многое другое.

Оглавление статьи

  1. Вводная часть
  2. Извлечение цифр
  3. Число в обратном порядке
  4. Количество цифр
  5. Палиндром число
  6. Число Армстронга
  7. Делители числа
  8. Простое число
  9. Наибольший общий множитель или делитель

Вводная часть

В этой статье представлены основные математические понятия используемые в программировании.

Извлечение цифр

Деление по модулю любого числа на десять способствует извлечению чисел. Предположим у нас есть некое число, например 7789. Если поделить его по модулю на десять 7789 % 10 результатом операции станет число 9. Так как деление по модулю отдает остаток от деления.

7780 % 10 = 0 остаток
(7780 + 9) % 10 = 9 остаток

Чтобы получить следующее число после 9, нужно сократить число 7789 до 778 и повторить деление по модулю 10. Сократить число 7789 до 778 можно поделив 7789 на 10 и откинув дробную часть.

7789 / 10 = 778,9 => 778

Таким образом если продолжить данную манипуляции с делением по модулю и с обычным делением, то можно извлечь все цифры, содержащиеся в числе.

Пример кода с извлечением всех цифр из числа.

JS
let n = 7789

let digit1 = n % 10 // 7789 % 10 = 9
let num1 = parseInt(n / 10) // 7789 / 10 = 778

let digit2 = num1 % 10 // 778 % 10 = 8
let num2 = parseInt(num1 / 10) // 778 / 10 = 77

let digit3 = num2 % 10 // 77 % 10 = 7
let num3 = parseInt(num2 / 10) // 77 / 10 = 7

let digit4 = num3 % 10 // 7 % 10 = 7
let num4 = parseInt(num3 / 10) // 7 / 10 = 0

// "Исходное число:" 7789
console.log('Исходное число:', n)

// "Извлеченные цифры:" "9 8 7 7"
console.log('Извлеченные цифры:', `${digit1} ${digit2} ${digit3} ${digit4}`)

Число в обратном порядке

Используя вышеуказанную математическую технику можно отобразить число в обратном порядке.

JS
let n = 7789
let clone = n
let str = ''

while (n > 0) {
  str += n % 10
  n = parseInt(n / 10)
}

// "Исходное число:" 7789
console.log('Исходное число:', clone)

// "Перевернутое число" 9877
console.log('Перевернутое число', parseInt(`${str}`))

Вариант 2

Первый вариант заключался в создании строки и последующем переводом ее в целое число. Второй вариант сразу приводит к числу без использования строки.

JS
let n = 7789
let clone = n
let revNum = 0

while (n > 0) {
  revNum = (revNum * 10) + n % 10
  n = parseInt(n / 10)
}

// "Исходное число:" 7789
console.log('Исходное число:', clone)

// "Перевернутое число" 9877
console.log('Перевернутое число', revNum)

Количество цифр

Используя вышеуказанную математическую технику можно подсчитать количество цифр в числе.

JS
let n = 7789
let count = 0

while ( n > 0) {
  n = parseInt(n / 10)
  count++
}

// "Количество цифр:" 4
console.log('Количество цифр:', count)

Вариант 2

Так же получить количество цифр в числе можно через операцию логарифм от числа по основанию 10.

JS
let n = 7789
let count = Math.ceil(Math.log10(n))

console.log('Количество цифр:', count)

Палиндром число

Рассмотрим вариант определения является число палиндромом или нет используя всю туже математическую технику. Число является палиндромом если оно остается таким же как исходное после переворачивания в обратном порядке.

JS
let n = 121
let clone = n
let newNum = 0

while (n > 0) {
  newNum = (newNum * 10) + n % 10
  n = parseInt(n / 10)
}

console.log('Исходное число:', clone)
console.log('Перевернутое число:', newNum)
console.log(clone === newNum ? 'Палиндром' : 'Не палиндром')

Число Армстронга

Определим является ли исходное число числом Армстронга. Числом Армстронга является такое число в котором сумма его цифр возведенная в степень 3 равна исходному числу.

Например: 371 => 3^3 + 7^3 + 1^3 = 371

JS
let n = 371 // 3^3 + 7^3 + 1^3 = 371
let clone = n
let newNum = 0

while (n > 0) {
  newNum += Math.pow(n % 10, 3)
  n = parseInt(n / 10)
}

// Число Армстронга
console.log(newNum === clone ? 'Число Армстронга' : 'Не число Армстронга')

Делители числа

Определим все делители исходного числа на которые исходное число делится без остатка.

Например: 36 делится без остатка на 1 2 3 4 6 9 12 18 36

JS
let n = 36 // 1 2 3 4 6 9 12 18 36
let list = []

for (let i = 1; i <= n; i++) {
  if (n % i === 0) {
    list.push(i)
  }
}

// "Делится без остатка на:" "1 2 3 4 6 9 12 18 36"
console.log('Делится без остатка на:', list.join(' '))

Вариант 2

Во втором варианте сокращается проход по числам в два раза. Если поделить пополам все числа на которые делится число 36 без остатка, то получится 1 2 3 4 6 вместо 1 2 3 4 6 9 12 18 36. Так как числа 9 12 18 36 можно получить при делении числа 36 на 1 2 3 4 6.

36 / 1 = 36
36 / 2 = 18
36 / 3 = 12
36 / 4 = 9
36 / 6 = 6

JS
let n = 36 // 1 2 3 4 6 9 12 18 36
let list = []

for (let i = 1; i <= Math.sqrt(n); i++) {
  if (n % i === 0) {
    list.push(i)

    if (n / i !== i) {
      list.push(n / i)
    }
  }
}

list.sort((a, b) => a - b)

// "Делится без остатка на:" "1 2 3 4 6 9 12 18 36"
console.log('Делится без остатка на:', list.join(' '))

Простое число

Определим является ли исходное число простым. Простое число это такое число которое имеет только два делителя 1 и само исходное число.

JS
let n = 11
let count = 0

for (let i = 1; i <= Math.sqrt(n); i++) {
  if (n % i === 0) {
    count++

    if (n / i !== i) count++
  }
}

// Простое число
console.log(count === 2 ? 'Простое число' : 'Не простое число')

Наибольший общий множитель или делитель

Решение задачи при которой необходимо найти для двух чисел один наибольший общий множитель или делитель, например:

Число 9: 1*, 3*, 9
Число 12: 1*, 2, 3*, 4, 6, 12

Общие делители отмечены звездочкой, наибольший из них это цифра 3.

JS
let a = 9  // 1*, 3*, 9
let b = 12 // 1*, 2, 3*, 4, 6, 12
let res = 1

for (let i = Math.min(a,b); i > 0 ; i--) {
  if (a % i === 0 && b % i === 0) {
    res = i
    break
  }
}

// Общий делитель: 3
console.log('Общий делитель:' + res)

Вариант 2

Решение с помощью алгоритма Евклида.

JS
let a = 9  // 1*, 3*, 9
let b = 12 // 1*, 2, 3*, 4, 6, 12
let res = 1

while (a > 0 && b > 0) {
  if (a > b) a = a % b
  else b = b % a
}

if (a === 0) res = b
else res = a

// Общий делитель:3
console.log('Общий делитель:' + res)
Предыдущая статья Паттерны и алгоритмы для работы с двумерными циклами Следующая статья Базовая концепция рекурсии, решения типовых задач