Найти произведения цифр в R

#r

#r

Вопрос:

Может кто-нибудь помочь мне исправить код, чтобы получить произведение цифр (пример 457) в программировании на R? Я попытался запустить этот код:

 number <- 457
product <- 1
while(number > 0) {
  product <- product * (number%%10)
  number <- number/10
} 
print(product)
  

но он продолжает давать мне 0. Я не могу найти никакого кода, доступного для R, поэтому я попытался пересмотреть код из java, но он не может дать мне ответ (140), который я искал. Может кто-нибудь помочь мне исправить это?

Ответ №1:

Быстрая функция с использованием базы R. Один из простых способов — преобразовать число в строку, разделить его, преобразовать обратно в числовое значение, а затем использовать prod()

 number_product <- function(x){
prod(as.numeric(unlist(strsplit(as.character(x),split = ""))))
}
number_product(457)
  

Комментарии:

1. спасибо за помощь! Но что, если требованием является код без использования функции?

2. prod(as.numeric(str_split(x, "", simplify = TRUE))) это немного более короткая версия, позволяющая избежать необходимости unlist и as.character

3. @cee_zee тогда вы могли бы просто использовать, например prod(as.numeric(str_split(457, "", simplify = TRUE))) . Но я бы подумал, что функция более полезна, если вы не хотите использовать только 457 🙂

4. будет ли это тот же код, который я могу использовать, если задается запрос цикла?

Ответ №2:

Это математическое решение, которое не преобразует ваш ввод в строку.

 ten <- 10^seq_len(ceiling(log10(number)))
prod(number %% ten %/% (ten/10))
  

Если вас интересует экономия времени, это решение быстрее:

 number <- 123456789

microbenchmark::microbenchmark(
 math = {ten <- 10^seq_len(ceiling(log10(number)))
         prod(number %% ten %/% (ten/10))},
 string = prod(as.numeric(unlist(strsplit(as.character(number),split = ""))))
)
#> Unit: microseconds
#>    expr  min   lq   mean median    uq   max neval
#>    math  4.4  5.1  6.649   5.70  6.60  48.9   100
#>  string 10.4 11.1 15.700  11.85 16.85 139.7   100
  

Ответ №3:

Простой способ — использовать utf8ToInt as.character , как показано ниже

 > prod(utf8ToInt(as.character(number)) - utf8ToInt('0'))
[1] 140