罗马数字转换程序erlang版本

-module(roman).
-compile(export_all).


mapRoman(Num) ->
 lists:foldl(fun(X, Y) -> Y ++ X end , "", lists:map(fun mapNum/1, subtractNum(Num))).


getActionResult({_Action, 0, _Src, _Dst}, Result) -> Result;
getActionResult({Action, N, Src, Dst}, Result) ->
 Compute = fun(add, X, Y) -> X ++ Y;
     (del, X, Y) -> Y ++ X end,
 getActionResult({Action, N-1, Src, Dst}, Compute(Action, Result, Dst)).


subtractNum(Num) -> subtractNum(Num, 1000, []).
subtractNum(0, 0, Result) -> lists:reverse(Result);
subtractNum(Num, InitNum, Result) ->
 SubNum = Num div InitNum,
 ModNum = Num rem InitNum,
 subtractNum(ModNum, InitNum div 10, [{SubNum, InitNum}|Result]).


mapNum({Num, Level}) ->
 {Action, N, Src, Dst} = getPosAction(Num, Level),
 getActionResult({Action, N, Src, Dst}, Src).


getPosAction(Num, Level) ->
 Dict = #{ 1 => {"I", "V", "X"}, 10 => {"X", "L", "C"}, 100 => {"C", "D", "M"},
     1000 => {"M", "", ""}},
 {One, Five, Ten} = maps:get(Level, Dict, {"", "", ""}),
 if
  Num == 0 -> {add, 0, "", ""};
  Num < 4 ->
   {add, Num - 1, One, One};
  Num >= 5 andalso Num < 9 ->
   {add, Num - 5, Five, One};
  Num == 4 ->
   {del, 1, Five, One};
  Num == 9 ->
   {del, 1, Ten, One}

 end.


测试  "MDCCCLXXXVIII" = mapRoman(1888),

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值