【问题标题】:Writing a program that goes from a number x in base 10 to a vector with the number in base 16 in R编写一个程序,从以 10 为底的数字 x 到 R 中以 16 为底的数字的向量
【发布时间】:2018-08-19 19:44:18
【问题描述】:
hexadecimal1 <- function(x) {

y <- integer(0)

   while (x >= 16) {
   r <- x%%16
   x <- x%/%16
   y <- c(r, y)
   if(r==10) { r<- "A"}
   if(r==11) { r<- "B"}
   if(r==12) { r<- "C"}
   if(r==13) { r<- "D"}
   if(r==14) { r<- "E"}
   if(r==15) { r<- "F"}
   } 
y <- c(x, y)
y
}

我应该编写一个算法,在向量中给出十六进制数字。我当前的算法实际上有效,但显示 10,11,12,13,14,15 而不是 A,B,C,D,E,F... 知道如何使用这些字母而不是 10、11、... 提前感谢您的帮助。

【问题讨论】:

  • 您是否愿意为小于 10 的值打印 1, 2, 3, ....etc
  • 关于如何自己解决的建议:告诉桌子上的橡皮鸭每行对每个变量的作用。请特别注意 r 在将其设置为 while 循环内的字母之后会发生什么。即,您已将其设置为“B”。 r接下来会发生什么?
  • 然后只需将行 `r if 下方。您不允许在将 r 合并到 y 之前对其进行评估。
  • @LakhdarMohamedAmine 有点像。请参阅下面的答案,了解既能倾听又能回应的橡皮鸭。
  • @LakhdarMohamedAmine。停止污蔑你的问题。如果这是家庭作业,那么您可能应该直言不讳。

标签: r algorithm hex base


【解决方案1】:

我不给你一个工作算法,而是给你一个调试工具:

把你的函数改成这样:

hexadecimal1 <- function(x) {
  browser()
  y <- integer(0)

  while (x >= 16) {
    r <- x%%16
    x <- x%/%16
    y <- c(r, y)
    if(r==10) { r<- "A"}
    if(r==11) { r<- "B"}
    if(r==12) { r<- "C"}
    if(r==13) { r<- "D"}
    if(r==14) { r<- "E"}
    if(r==15) { r<- "F"}
  } 
  y <- c(x, y)
  y
}

接下来,拨打:hexadecimal1(31)

要确定下一步要做什么,请输入 help,然后按 Enter。

这里有一个提示:输入n,然后按 Enter。

为简化操作,请在 RStudio 中执行此操作,并密切注意右上角窗格中的“环境”选项卡。

【讨论】:

    【解决方案2】:

    这个怎么样:

    hex <- function(x) {
        if(x==0) return("0")
        if(x<0) return(paste0("-", hex(-x)))
    
        map <- c(as.character(0:9), LETTERS[1:6])
        res <- c()
        while (x>0) {
            res <- c(map[x %% 16 + 1], res)
            x <- x %/% 16
        }
        return(res)
    }
    

    【讨论】:

    • 呸。让他进行调试:p 但是是的,这显然工作得很好,并回答了他提出的问题。赞成!
    • 您可以通过定义res &lt;- character(ceiling(logb(x, 16))); i &lt;- length(res)、为i &gt; 0 运行while 循环并使用res[i] &lt;- map[x %% 16 + 1] 来避免增长res。您还需要将i &lt;- i - 1 添加到循环中。
    【解决方案3】:

    已经有一个 R 函数可以做到这一点:

    > prin_hex <- function(x) print(as.hexmode(x))
    > prin_hex(30)
    [1] "1e"
    > prin_hex <- function(x) print(paste(x, "==", as.hexmode(x)))
    > prin_hex(30)
    [1] "30 == 1e"
    

    您也可以留下一个数值 class-hexmodeprint.hexmode 函数将返回一个字符值,同时让数值运算继续对其执行。

    (八进制也有八进制模式。)

    在查看 print.hexmode 的代码(将我们引用到 format.hexmode)后,我们发现 hexmode 类的 print(通过 format)泛型的繁重工作是由

     sprintf("%x", <numeric>)
    
     # e.g.
    > sprintf("%x", 20)
    [1] "14"
    

    【讨论】:

    • 我喜欢structure(x, class = "hexmode"),主要是因为我不知道它在做什么。但我怀疑 OP 需要编写实际的算法,而不仅仅是获取行为。
    • 很难说。听起来像是家庭作业,但也许允许学生发现 R 语言中的隐藏功能?有一组为 hexmode 类定制的通用函数(print 和数字运算符)。在继承一些可打印特性的同时,允许值保持普通数字是一种巧妙的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    相关资源
    最近更新 更多