挑战:
德国极客播客Fanboys在他们最新的第 135 集中询问他们的观众,以检查即将播出的节目中的哪一集编号将是 2 级 Harshad 编号。
给定数字基数的Harshad 数是一个整数,当写入该基数时,它可以被其数字之和整除。
根据 Fanboys 的解释,一个 2 级 Harshad 数应是一个可被其数字之和整除的数,所得比率本身应为 Harshad 数。
解决方案(丑陋,待完善):
我尝试使用以下代码在 R 中解决此任务,并使用以下代码添加函数“two.step.harshed.number(start, end)”:
# Function to calculate the two-leveled Harshed Numbers for given integer number intervall
two.step.harshed.number = function(start, end)
{
# Function to calculate a digit sum
digitsum = function (x) {sum(as.numeric(unlist(strsplit(as.character(x), split="")))) }
# Function returning a numbers value if integer, otherwise NA
checkinteger = function (x) {
if (x%%1==0) {
return (x)
}
else {
return(NA)
}
}
# Setup data frame with rows of numbers from start value to end value
db = data.frame(number=start:end)
# 1st level run
# Calculate the digit sum of those numbers
db$digitsum1 = sapply(db$number, FUN=digitsum)
# Calculate the ratio of number and it's digit sum and keep only if it's an integer
db$ratio1 = db$number / db$digitsum1
db$ratio1 = sapply(db$ratio1, FUN=checkinteger)
db = na.omit(db)
# 2st level run
# Calculate the digit sum of the previous (integer) ratio
db$digitsum2 = sapply(db$ratio1, FUN=digitsum)
# Calculate the ratio of the previous ratio and it's digit sum and keep only if it's an integer
db$ratio2 = db$ratio1 / db$digitsum2
db$ratio2 = sapply(db$ratio2, FUN=checkinteger)
db = na.omit(db)
# Return remaining number, which proved to be two-leveled Harshed Numbers
return(db$number)
}
使用该功能时的挑战解决方案(下一集至第 200 集):
two.step.harshed.number(136, 200)
是一系列三个数字,对我来说似乎是正确的:
162 180 200
问题:
我知道这是一个初学者代码。我想创建另一个将任务概括为 n 步的函数。即函数“n.step.harshed.number(steps, start, end)”。 有什么想法可以实现这一点并使代码更高效吗?