как создать делимое методом в ruby - PullRequest
0 голосов
/ 16 января 2020

В настоящее время я учусь ruby, и ваша помощь будет принята с благодарностью.

Я пытаюсь отобразить следующие результаты в моем терминале:

1
2
3 i am divisible by 3
4
5 i am divisible by 5
6 i am divisible by 3
7
8
9 i am divisible by 3
10 i am divisible by 5
11
12 i am divisible by 3
13
14
15 i am divisible by 3 and 5
16
17
18 i am divisible by 3
19
20 i am divisible by 5

Я не уверен, как go о. Я написал следующий код в моем файле divisible.rb:

def count
  numbers = (1..20)
  numbers.each do |number|
    if number % 1 == 1
      puts "#{number}"
    elsif number % 3 == 0
      puts "#{number} i am divisible by 3"
    elsif number % 5 == 0
      puts "#{number} i am divisible by 5"
    elsif number % 3 == 0 && number % 5 == 0
      puts "#{number} i am divisible by 3 & 5"
    end
  end
end

, но в терминале он выводит следующее:

irb(main):001:0> count
3 i am divisible by 3
5 i am divisible by 5
6 i am divisible by 3
9 i am divisible by 3
10 i am divisible by 5
12 i am divisible by 3
15 i am divisible by 3
18 i am divisible by 3
20 i am divisible by 5
=> 1..20

, не могли бы вы, пожалуйста, посоветовать мне правильный путь

Ответы [ 2 ]

3 голосов
/ 16 января 2020

Есть 3 шага, чтобы исправить это

  1. Удалить 1-е выражение if,
  2. Вы должны переместить это: elsif number % 3 == 0 && number % 5 == 0 на 1-й шаг
  3. Добавить else puts number

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

def count
  numbers = (1..20)
  numbers.each do |number|
    if number % 3 == 0 && number % 5 == 0
      puts "#{number} i am divisible by 3 & 5"
    elsif number % 3 == 0
      puts "#{number} i am divisible by 3"
    elsif number % 5 == 0
      puts "#{number} i am divisible by 5"
    else
      puts number
    end
  end
end

UPD

Давайте добавим пояснение об этих шагах:

1-й и 3-й этапы: деление на 1 всегда возвращает 0 в результате, поэтому первая причина - ошибка в логи c, а вторая - как мы теперь знаем, это всегда 0, нам не нужно проверять это еще один раз.

2-й шаг: когда мы проверяем, например, 3 с elsif number % 3 == 0, он возвращает true, поэтому следующие операторы if проверяться не будут, чтобы исправить это, мы должны сначала добавить проверку для number % 3 == 0 && number % 5 == 0

Благодаря @ 3limin4t0r, вы правы, это всегда лучше объяснить.

1 голос
/ 16 января 2020

Ради интереса вы можете использовать класс Prime из стандартной библиотеки следующим образом:

require 'prime'

(0..30).each do |number|
  if [0, 1].include? number
    puts number
    next
  end
  if Prime.prime?(number)
    puts "#{number} is prime"
  else
    divisors = Prime.prime_division(number).map(&:first)
    puts "#{number} is divisible by " + divisors.join(" and ") if divisors.size > 1
  end
end
...