Сильный числовой идентификатор (проблема с кодом Ruby) - PullRequest
1 голос
/ 07 июля 2019

Мне нужно написать код, который может идентифицировать Сильное число.

Сильное число - это число, в котором сумма факториала его цифр равна самому числу.

Например: 145, начиная с 1! + 4! + 5! = 1 + 24 + 120 = 145

Я пытался решить эту проблему, но безрезультатно. Может кто-нибудь сказать мне, где я иду не так? Мне нужно, чтобы переменные «сумматор» и «множитель» увеличивались с каждым циклом, чтобы я мог сравнить итоговое значение в конце метода, но они по умолчанию остаются равными нулю. Кто-нибудь может увидеть, где я иду не так? Спасибо!

def strong_num(n)
  digits=n.divmod(1)
  multiplier=1
  adder=0

  digits.each do |digit|
    x=digit
    digit-1.times do
      multiplier=multiplier*x
      adder=adder+multiplier

      x=x-1
    end
  end

  if n==adder
    return "STRONG!!!!"
  else 
    return "Not Strong !!"
  end
end

Пример ввода:

Test.assert_equals(strong_num(1)  , "STRONG!!!!")
Test.assert_equals(strong_num(2)  , "STRONG!!!!")
Test.assert_equals(strong_num(7)  , "Not Strong !!")
Test.assert_equals(strong_num(93) , "Not Strong !!")
Test.assert_equals(strong_num(145), "STRONG!!!!")
Test.assert_equals(strong_num(185), "Not Strong !!")

Пример вывода:

Test Passed: Value == "STRONG!!!!"
Test Passed: Value == "STRONG!!!!"
Expected: "Not Strong !!", instead got: "STRONG!!!!"
Expected: "Not Strong !!", instead got: "STRONG!!!!"
Test Passed: Value == "STRONG!!!!"
Expected: "Not Strong !!", instead got: "STRONG!!!!"
Test Passed: Value == "STRONG!!!!"
Expected: "Not Strong !!", instead got: "STRONG!!!!"

Ответы [ 2 ]

0 голосов
/ 14 июля 2019

k.divmod(n) возвращает массив = [quocient_of_division (k / n), остаток от деления (k / n)].Пример: 145.divmod(1) возвращает =>[145, 0].Кроме того, digit-1.times в вашем коде должно быть (digit-1).times

То, как я думал, что это можно сделать, выглядит следующим образом:

def is_strong?(number)
  result = 0
  numbers = number.to_s.chars.map(&:to_i)
  powers = { 0 => 1, 1 => 1, 2 => 2, 3 => 6, 4 => 24, 5 => 120, 6 => 760, 7 => 5040, 8 => 40320, 9 => 362880 }
  numbers.each do |n|
    result += powers[n]
  end  
  return (result == number)
end
0 голосов
/ 14 июля 2019

Надеюсь, это поможет! Я пытался уменьшить код, разбив его на куски

Ввод: 145

def method_name(num)
  array = num.to_s.chars.map(&:to_i) # => [1,4,5]
  fact_arr = array.map {|f| fact(f)} # => [1, 24, 120]

  if (num == fact_arr.inject(:+))
    return "STRONG!!"
  else
    return "NOT STRONG!!"
  end
end

def fact(n)
  if (n == 0)
    1
  else
    n * fact(n-1)
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...