#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