请选择 进入手机版 | 继续访问电脑版
楼主: llb_321
1347 3

[程序分享] 求二数的最大公约数_有限小数化最简分数_无限循环小数化最简分数的函数 [推广有奖]

  • 3关注
  • 49粉丝

教授VIP

学科带头人

10%

还不是VIP/贵宾

-

TA的文库  其他...

LATEX & R 模板和代码

威望
2
论坛币
18020 个
通用积分
1705.0257
学术水平
407 点
热心指数
416 点
信用等级
354 点
经验
1960 点
帖子
1417
精华
1
在线时间
1035 小时
注册时间
2010-6-18
最后登录
2023-8-18

初级热心勋章 初级信用勋章 中级热心勋章 中级信用勋章 初级学术勋章

llb_321 在职认证  发表于 2020-6-28 19:15:18 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
之所以新发一贴,是想着与更多同学更方便地交流。

自编的三个函数:
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


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:公约数 Library string tring BRARY 小数化分数 最小公约数 函数

回帖推荐

megapanda 发表于2楼  查看完整内容

最大公约数,DescTools包有个GCD函数也可以求:)
已有 2 人评分经验 论坛币 收起 理由
dxystata + 100 + 10 精彩帖子
cheetahfly + 30 精彩帖子

总评分: 经验 + 100  论坛币 + 40   查看全部评分

本帖被以下文库推荐

megapanda 发表于 2020-6-28 23:03:52 |显示全部楼层 |坛友微信交流群
最大公约数,DescTools包有个GCD函数也可以求:)  
已有 2 人评分经验 论坛币 收起 理由
dxystata + 100 + 5 鼓励积极发帖讨论
llb_321 + 5 精彩帖子

总评分: 经验 + 100  论坛币 + 10   查看全部评分

使用道具

llb_321 在职认证  发表于 2020-6-28 23:32:04 |显示全部楼层 |坛友微信交流群
megapanda 发表于 2020-6-28 23:03
最大公约数,DescTools包有个GCD函数也可以求:)
谢谢

使用道具

llb_321 在职认证  发表于 2020-6-30 20:08:02 |显示全部楼层 |坛友微信交流群
经luzifer_li提醒,MASS包fractions()可以实现有限小数化分数。

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-17 03:31