首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >平衡三元串和

平衡三元串和
EN

Stack Overflow用户
提问于 2019-01-09 17:31:18
回答 2查看 192关注 0票数 0

我必须编写一个用平衡三元(ternary)表示的两串数字之和的代码。与使用-1/0/+1不同,我必须使用-/./+,因为我不能转换整数-十进制数中的字符串-三元平衡数,所以我必须手动将输入中的两个字符串的字符之和,但是我不知道如何处理通过求和各种字符而产生的进位。

编辑:这就是我到目前为止得出的结果-- https://pastebin.com/R98RDHTQ,如果我求和-和-,代码给出的是.++而不是-++。这是因为当它与部分结果之和时,.-+,对于第一次进位,-.它不跟踪第二次进位.我该怎么解决呢?

代码语言:javascript
复制
(define btr-sum  
  (lambda(a b)

    (cond
      ((< (string-length a)(string-length b))(btr-sum (normalize a b) b))
      ((> (string-length a)(string-length b))(btr-sum a (normalize b a)))
      ((and(char=? (string-ref a 0) #\. )(char=?(string-ref b 0)#\b))(btr-sum (substring a 1 )(substring b 1)))
      (else (real (normalize(real a b ".") (create-rip a b ".")) (create-rip a b ".") "."));; (+(+ a b) c)
      )    
    )
  )



(define real ;;sums strings a and b without carry
  (lambda(a b r);;strings
     (if (>(string-length a)1)
         (string-append

          (real ;;recursive
           (substring a 0 (-(string-length a)1))
           (substring b 0 (- (string-length b)1))
           r)


          (string(somma ;;sums last chars of strings
                 (string-ref a (-(string-length a)1))
                 (string-ref b (-(string-length b)1))
                 )
                 )
          )

         (string(somma (string-ref a 0)(string-ref b 0)))
         )


    )
  )




(define normalize ;;if the length of subj < length of obj, normalize fills stacks up subj with "."
  (lambda(subj obj)
    (if (not(= (string-length subj)(string-length obj)))
        (normalize (string-append "." subj) obj)
        subj
        )
    )
  )

(define create-rip ;;generates the carry of the sum of a and b
  (lambda (a b c)
    (if (> (string-length a) 1)
        (cond ;; if length>1 then do it again
          (
           (and (char=? #\+(string-ref a (-(string-length a)1)))(char=? #\+ (string-ref b (-(string-length b)1))));;if +/+, add one + in carry
           (create-rip (substring a 0 (-(string-length a)1))(substring b 0 (-(string-length b)1))(string-append "+" c))
           )

          (
           (and (char=? #\-(string-ref a (-(string-length a)1)))(char=? #\- (string-ref b (-(string-length b)1))))if -/-, add one - in carry
           (create-rip (substring a 0 (-(string-length a)1))(substring b 0 (-(string-length b)1))(string-append "-" c))
           )
          (else  (create-rip (substring a 0 (-(string-length a)1))(substring b 0 (-(string-length b)1))(string-append "." c)))
          )

        (cond ;;if it's the last char do it only once
          (
           (and (char=? #\+(string-ref a (-(string-length a)1)))(char=? #\+ (string-ref b (-(string-length b)1))))
           (string-append "+" c)
           )

          (
           (and (char=? #\-(string-ref a (-(string-length a)1)))(char=? #\- (string-ref b (-(string-length b)1))))
           (string-append "-" c)
           )
          (else  (string-append "." c))
          )
        )
    )
  )


(define somma ;;general procedure to sum two char without taking care of carry
  (lambda(a b)
    (cond
      ((and (char=? a  #\-)(char=? b #\-))#\+)
      ((and (char=? a  #\.) (char=? b #\-))#\-)
      ((and (char=? a  #\+)(char=? b #\-))#\.)

      ((and (char=? a  #\-)(char=? b #\+))#\.)
      ((and (char=? a  #\.)(char=? b #\+))#\+)
      ((and (char=? a  #\+)(char=? b #\+))#\-)

      ((and (char=? a  #\-)(char=? b #\.))#\-)
      ((and (char=? a  #\.)(char=? b #\.))#\.)
      ((and (char=? a  #\+)(char=? b #\.)) #\+)
        )
    )
  )




(btr-sum "-""--")
EN

回答 2

Stack Overflow用户

发布于 2019-01-09 19:43:51

使用char->integerinteger->char在字符和整数之间来回转换。

票数 0
EN

Stack Overflow用户

发布于 2019-01-09 19:52:05

首先,计算出一个三元加法表;您引用的维基百科文章给出了大约三分之二的下降路径:

代码语言:javascript
复制
       -1      0      1
     ----   ----   ----
-1   -1 1     -1      0
0      -1      0      1
1       0      1   1 -1

然后三元加法仅仅是小学加两个数字的算法,从右到左工作,必要时携带。

编辑:原始海报询问如何跟踪携带。我不会编写代码,但是在临时变量中手工添加两个数字时,跟踪进位的方式是相同的;将其称为carry并将其初始化为零。要添加两个数字,请使用以下过程从右向左工作:在当前位置添加两个trit,使用上面显示的三元加法表,然后将carry添加到结果中。结果的低阶trit位于当前位置,高阶trit取代carry。一定不要在最后输掉最后一盘。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54115505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档