之所以新发一贴,是想着与更多同学更方便地交流。
自编的三个函数:
1、求两个整数的最大公约数
2、有限小数处理(参数A是输入小数)
3、无限循环小数处理(参数B是输入小数, L是循环节的位数)
#加载个包
library(stringr)
#求两个整数的最大公约数------------------------------
maxcf <- function (a, b) {
if (a < b) {
while (b %% a != 0) {
c <- b %% a
b <- a
a <- c
}
c <- a
}
else {
while (a %% b != 0) {
c <- a %% b
a <- b
b <- c
}
c <- b
}
c
}
#有限小数处理,参数A是输入小数----------------------------
dc2frc <- function (A) {
#小数部分
decp <- as.numeric(str_extract(as.character(A), "(?<=\\.)\\d+"))
dvid <- 10 ^ (str_length(decp))
paste(
as.character(A),
"的整数部分为",
as.character(floor(A)),
",",
"小数部分化为分数",
as.character(decp / maxcf(decp, dvid)),
"/",
as.character(dvid / maxcf(decp, dvid))
)
}
#无限循环小数处理,参数B是输入小数,L是循环节的位数-----------
dlp2frc <- function (B, L) {
#小数部分
dcp <- as.numeric(str_extract(as.character(B), "(?<=\\.)\\d+"))
if (str_length(dcp) == L) {
dvd <- (10 ^ L) - 1
paste(
as.character(B),
"循环节为",
as.character(dcp),
"的整数部分为",
as.character(floor(B)),
",",
"小数部分化为分数",
as.character(dcp / maxcf(dcp, dvd)),
"/",
as.character(dvd / maxcf(dcp, dvd))
)
}
else {
nlp <-
as.numeric(str_trunc(as.character(dcp), (str_length(dcp) - L), "right", ellipsis = ""))
lp <-
as.numeric(str_trunc(as.character(dcp), L, "left", ellipsis = ""))
dvd <- ((10 ^ L) - 1) * (10 ^ str_length(nlp))
paste(
as.character(B),
"循环节为",
as.character(lp),
"的整数部分为",
as.character(floor(B)),
",",
"小数部分化为分数",
as.character((dcp - nlp) / maxcf((dcp - nlp), dvd)),
"/",
as.character(dvd / maxcf((dcp - nlp), dvd))
)
}
}
#测试数据-----------------------------------------------------------
dc2frc(3.1415)
dc2frc(3.5)
dc2frc(1.95)
dlp2frc(3.2134,4)
dlp2frc(3.2134,3)
dlp2frc(3.2134,2)
dlp2frc(3.2134,1)
dlp2frc(1.9876543,7)
#另外再送一个函数吧
#求两个整数的最小公倍数---------------------------------------------
maxcm<-function (a,b) {
a * b / maxcf(a,b)
}
#------------------------------------------------------EOF