Chinaunix

标题: 练习题(阿拉伯数字转化为罗马数字) [打印本页]

作者: yestreenstars    时间: 2015-06-14 23:23
标题: 练习题(阿拉伯数字转化为罗马数字)
好久没发练习题了~
最近在学习Python时发现一道不错的题目,所以想分享给大家开动开动脑筋,有兴趣的童鞋不妨试着做一下~
不限制使用的脚本语言(awk/perl/python/php等都可以)~
题目:
罗马数字来源于古罗马编码系统。它们是基于字母表的特定字母的组合,所表示的数等于这些数字相加(或者是相减)得到的数。前十位的罗马数字是:
I,II,III,IV,V,VI,VII,VIII,IX和X。
罗马记数系统不是直接的十进制为基础,它没有零。罗马数字是根据这七个符号的组合:
符号值
I 1 (unus)
V 5 (quinque)
X 10 (decem)
L 50 (quinquaginta)
C 100 (centum)
D 500 (quingenti)
M 1,000 (mille)
更多额外的关于罗马数字的信息可以参考维基百科的文章.
在这个任务里,你应该返回给出指定的整数值的范围从1到3999的罗马数字。
输入: 一个整数 (int).
输出: 一个字符串形式的罗马数字 (str).
前提: 0 < number < 4000
测试数据:
6
76
499
3888
正确结果:
VI
LXXVI
CDXCIX
MMMDCCCLXXXVIII

作者: yestreenstars    时间: 2015-06-14 23:33
维基百科貌似被墙了~
有关阿拉伯数字和罗马数字的转换规律请通过百度百科去查或者fan墙去看维基百科吧~
作者: leijskg    时间: 2015-06-15 09:46
提示: 作者被禁止或删除 内容自动屏蔽
作者: haooooaaa    时间: 2015-06-15 09:49
  1. #!/usr/bin/env python

  2. num = raw_input("input a Number: ")
  3. roman = {1000:"M",500:"D",100:"C",50:"L",10:"X",9:"IX",8:"VIII",7:"VII",6:"VI",5:"V",4:"IV",3:"III",2:"II",1:"I"}

  4. try:
  5.     num = int(num)
  6. except:
  7.     print "Non Number"

  8. def mod_check(n, m):
  9.     if n%m != n:
  10.         return n%m
  11.     else:
  12.         return 0

  13. ro = [1000,500,100,50,10,5]
  14. ro_name = ""

  15. for i in ro:
  16.     a = mod_check(num, i)
  17.     if a == 0:
  18.         continue
  19.     else:
  20.         ro_name = ro_name + roman[i] * (num//i)
  21.         num = num%i

  22. print ro_name + roman[num]
复制代码

作者: yestreenstars    时间: 2015-06-15 09:56
回复 4# haooooaaa

有问题哦,比如输入9时……
   
作者: haooooaaa    时间: 2015-06-15 10:10
回复 5# yestreenstars

10以下看来的分开。
  1. #!/usr/bin/env python

  2. num = raw_input("input a Number: ")
  3. roman = {1000:"M",500:"D",100:"C",50:"L",10:"X",9:"IX",8:"VIII",7:"VII",6:"VI",5:"V",4:"IV",3:"III",2:"II",1:"I"}

  4. try:
  5.     num = int(num)
  6. except:
  7.     print "Non Number"

  8. def mod_check(n, m):
  9.     if n%m != n:
  10.         return n%m
  11.     else:
  12.         return 0

  13. ro = [1000,500,100,50,10,5]
  14. ro_name = ""

  15. if num < 10:
  16.     print roman[num]
  17. else:   
  18.     for i in ro:
  19.         a = mod_check(num, i)
  20.         if a == 0:
  21.             continue
  22.         else:
  23.             ro_name = ro_name + roman[i] * (num//i)
  24.             num = num%i
  25.     print ro_name + roman[num]
复制代码

作者: yestreenstars    时间: 2015-06-15 10:13
回复 6# haooooaaa

还是有问题,我上面给的测试数据你有测过吗?比如,输入499时结果就不对……
   
作者: haooooaaa    时间: 2015-06-15 10:26
回复 7# yestreenstars


    不明白了, D 不是 500吗 ?  有D应该500多了, 我再看看。。。
作者: yestreenstars    时间: 2015-06-15 10:29
回复 8# haooooaaa

那说明你还没明白罗马数字的规律~
   
作者: haooooaaa    时间: 2015-06-15 10:29
回复 7# yestreenstars


    还有这些规则, 还不知道啊。。。

计数规则:
1.若干相同数字连写表示的数是这些罗马数字的和,如III=3;

2.小数字在大数字前面表示的数是用大数字减去小数字,如IV=4;
3.小数字在大数字后面表示的数是用大数字加上小数字,如VI=6;

组合规则:

(1)基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。

(2)不能把基本数字 V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。
(3)V 和 X 左边的小数字只能用Ⅰ。
(4)L 和 C 左边的小数字只能用×。
(5)D 和 M 左 边的小数字只能用 C
作者: yestreenstars    时间: 2015-06-15 10:31
回复 10# haooooaaa

是啊,所以我看你的脚本写得那么简单,就感觉有点问题~
另外你的脚本不利于遍历啊,我觉得应该改进一下~
   
作者: reyleon    时间: 2015-06-15 10:40
蛋蛋疼~~~
作者: yestreenstars    时间: 2015-06-15 10:44
回复 12# reyleon

Python来一发吧,六神花露水~
   
作者: haooooaaa    时间: 2015-06-15 10:55
本帖最后由 haooooaaa 于 2015-06-15 10:59 编辑
  1. #!/usr/bin/env python

  2. roman = {1000:"M",900:"CM",500:"D",400:"CD",100:"C",90:"XC",50:"L",40:"XL",10:"X",9:"IX",8:"VIII",7:"VII",6:"VI",5:"V",4:"IV",3:"III",2:"II",1:"I"}

  3. def mod_check(n, m):
  4.     if n%m != n:
  5.         return n%m
  6.     else:
  7.         return 0

  8. def to_roman(n):
  9.     ro = [1000,900,500,400,100,90,50,40,10,5]
  10.     ro_name = ""
  11.     if n in roman.keys():
  12.         print roman[n]
  13.     else:   
  14.         for i in ro:
  15.             a = mod_check(n, i)
  16.             if a == 0:
  17.                 continue
  18.             else:
  19.                 ro_name = ro_name + roman[i] * (n//i)
  20.                 n = n%i
  21.                 if n in roman.keys():
  22.                     break
  23.         print ro_name + roman[n]


  24. for i in [3,4,6,9,76,99,199,299,499,3888]:
  25.     to_roman(i)
复制代码
这样似乎不智能了。。。
作者: hjfeng1988    时间: 2015-06-15 10:57
明白了阿拉伯数字转化为罗马数字是怎么来的
作者: ly5066113    时间: 2015-06-15 10:59
回复 1# yestreenstars


枚举法。
  1. awk -F '' '
  2. BEGIN{
  3.         a[1] = "I"
  4.         a[2] = "II"
  5.         a[3] = "III"
  6.         a[4] = "IV"
  7.         a[5] = "V"
  8.         a[6] = "VI"
  9.         a[7] = "VII"
  10.         a[8] = "VIII"
  11.         a[9] = "IX"
  12.         a[10] = "X"
  13.         a[20] = "XX"
  14.         a[30] = "XXX"
  15.         a[40] = "XL"
  16.         a[50] = "L"
  17.         a[60] = "LX"
  18.         a[70] = "LXX"
  19.         a[80] = "LXXX"
  20.         a[90] = "XC"
  21.         a[100] = "C"
  22.         a[200] = "CC"
  23.         a[300] = "CCC"
  24.         a[400] = "CD"
  25.         a[500] = "D"
  26.         a[600] = "DC"
  27.         a[700] = "DCC"
  28.         a[800] = "DCCC"
  29.         a[900] = "CM"
  30.         a[1000] = "M"
  31.         a[2000] = "MM"
  32.         a[3000] = "MMM"
  33. }
  34. {
  35.         if($1<=0||$1>=4000)
  36.                 next
  37.         for(i=1;i<=NF;i++)
  38.                 printf a[$i*10^(NF-i)]
  39.         print ""
  40. }
  41. ' file
复制代码

作者: reyleon    时间: 2015-06-15 11:07
回复 13# yestreenstars
  1. #!/usr/bin/python
  2. # coding:utf-8

  3. roman_numeral_map = (('M',  1000),
  4.                      ('CM', 900),
  5.                      ('D',  500),
  6.                      ('CD', 400),
  7.                      ('C',  100),
  8.                      ('XC', 90),
  9.                      ('L',  50),
  10.                      ('XL', 40),
  11.                      ('X',  10),
  12.                      ('IX', 9),
  13.                      ('V',  5),
  14.                      ('IV', 4),
  15.                      ('I',  1))

  16. class OutOfRangeError(ValueError):
  17.     pass

  18. def to_roman(n):
  19.     '''convert integer to Roman numeral'''
  20.     if n > 3999:
  21.         raise OutOfRangeError('number out of range (must be less than 4000)')

  22.     result = ''
  23.     for numeral, integer in roman_numeral_map:
  24.         while n >= integer:
  25.             result += numeral
  26.             n -= integer
  27.             #print('subtracting {0} from input, adding {1} to output'.format(integer, numeral))
  28.     return result

  29. if __name__ == '__main__':
  30.     for item in [6, 76, 499, 3888]:
  31.         print to_roman(item)
复制代码

作者: reyleon    时间: 2015-06-15 11:08
表示搜到的现成的东西..
作者: Herowinter    时间: 2015-06-15 11:18
回复 1# yestreenstars

为什么499对应的罗马数字是CDXCIX, 没看懂...
   
作者: yestreenstars    时间: 2015-06-15 11:21
回复 18# reyleon

You are so lazy~
   
作者: yestreenstars    时间: 2015-06-15 11:22
回复 19# Herowinter

400是CD
90是XC
9是IX

懂了吗?
   
作者: ly5066113    时间: 2015-06-15 11:26
回复 20# yestreenstars


lazy more
  1. perl -MRoman -lne 'print Roman($_)' file
复制代码

作者: Herowinter    时间: 2015-06-15 11:26
回复 21# yestreenstars

多谢.看题不认真,你一楼都说了,原来罗马数字的4 9都是用减法
5-1  10-1表示的...
   
作者: yestreenstars    时间: 2015-06-15 11:27
回复 16# ly5066113

牛,学习了,这样枚举~
   
作者: yestreenstars    时间: 2015-06-15 11:28
回复 23# Herowinter

是的,既然看懂题意了,要不要来一发?
   
作者: yestreenstars    时间: 2015-06-15 11:30
回复 22# ly5066113

只是交流算法哈~
   
作者: jason680    时间: 2015-06-15 11:31
本帖最后由 jason680 于 2015-06-15 12:00 编辑

回复 1# yestreenstars

What You Think Is What You Code(WYTIWYC)

I 1 (unus)
V 5 (quinque)
X 10 (decem)
L 50 (quinquaginta)
C 100 (centum)
D 500 (quingenti)
M 1,000 (mille)
   
0. prepare
  array R for Roman number(I,V,X...)
  array V for Value number(1,5,10,...)

1. check number (  1 <= number <= 3999 )
  if(S<1||3999<S){print "out of range 1~3999: "S;next}

2. check number with 10 times only (1000, 100, 10, and 1)
  for(n=t;n>0;n-=2)
  Note: t =7, and V[7] = 1000, V[5]=100, ...

3. for special number 4 and 9
  4xx = 100 and 500 = CD    (Note: R[5] and R[5+1], n=5)
  9xx = 100 and 1000 = CM  (Note: R[5] and R[5+2], n=5)
  if(m%5==4){s=s R[n]R[n+(m>4?2:1)];

4. more than number 5
   6x = 50 and 1x = LX   (Note:  R[3+1] and R[3])
   7x = 50 and 2x = LXX
   if(m>=5){s=s R[n+1];m-=5}

--------------------------------------------------------------------------
$ cat FILE
6
76
499
3888
9
4000
0
-1

$ awk '
BEGIN{
  # 0. prepare
  t=split("IVXLCDM",R,"");
  for(n=1;n<=t;n++){
    m=int(n/2);
    N=10**m*(n%2?1:.5);
    V[n]=N
  }
}
{
  S=N=$0;
  # 1. check number (  1 <= number <= 3999 )
  if(S<1||3999<S){
    print "out of range 1~3999: "S;
    next
  }
  s="";
  # 2. check number with 10 times only (1000, 100, 10, and 1)
  for(n=t;n>0;n-=2){
    if(N>=V[n]){
      m=int(N/V[n]);
      N%=V[n];
      # 3. for special number 4 and 9
      if(m%5==4){
        s=s R[n]R[n+(m>4?2:1)];
        continue
      }
     #4. more than number 5
     if(m>=5){
       s=s R[n+1];
       m-=5
     }
     # for normal number
     for(c=1;c<=m;c++)
       s=s R[n]
    }
  }
  print S,s
}' FILE
6 VI
76 LXXVI
499 CDXCIX
3888 MMMDCCCLXXXVIII
9 IX
out of range 1~3999: 4000
out of range 1~3999: 0
out of range 1~3999: -1



作者: yestreenstars    时间: 2015-06-15 11:33
回复 14# haooooaaa

还是有很多问题,比如20……
   
作者: reyleon    时间: 2015-06-15 11:34
回复 22# ly5066113


    哈哈哈哈
作者: Herowinter    时间: 2015-06-15 12:30
回复 25# yestreenstars
代码好像比较乱...
  1. awk 'function toRoman(n,l){rstr="";if(n==9){if(l==2)rstr="CM";else if(l==1)rstr="XC";else if(l==0)rstr="IX"}else if(n>=5){if(l==2){rstr="D";for(i=6;i<=n;i++)rstr=rstr"C"}else if(l==1){rstr="L";for(i=6;i<=n;i++)rstr=rstr"X"}else if(l==0){rstr="V";for(i=6;i<=n;i++)rstr=rstr"I"}}else if(n==4){if(l==2)rstr="CD";else if(l==1)rstr="XL";else if(l==0)rstr="IV"}else if(n>=1){if(l==3)for(i=1;i<=n;i++)rstr=rstr"M";else if(l==2)for(i=1;i<=n;i++)rstr=rstr"C";else if(l==1)for(i=1;i<=n;i++)rstr=rstr"X";else if(l==0)for(i=1;i<=n;i++)rstr=rstr"I"};return rstr} {l3=int($0/1000);l2=int(($0-l3*1000)/100);l1=int(($0-l3*1000-l2*100)/10);l0=int($0-l3*1000-l2*100-l1*10);s=toRoman(l3,3)toRoman(l2,2)toRoman(l1,1)toRoman(l0,0);print s}' i
  2. VI
  3. LXXVI
  4. CDXCIX
  5. MMMDCCCLXXXVIII
复制代码

作者: yestreenstars    时间: 2015-06-15 13:45
回复 30# Herowinter

写成多行脚本会好些~
   
作者: yestreenstars    时间: 2015-06-15 15:26
回复 27# jason680

不错的思路,但那些单字符的变量看得有点晕,单行命令用单字符变量还好~
   
作者: jason680    时间: 2015-06-15 16:22
本帖最后由 jason680 于 2015-06-15 16:30 编辑

回复 32# yestreenstars

$ awk '
BEGIN{
  # 0. prepare roman and value array
  # rom[1] = I, val[1] = 1
  # rom[2] = V, val[2] = 5
  # rom[3] = X, val[3] = 10
  # ...
  # rom[7] = X, val[7] = 1000
  max = split("IVXLCDM",rom,"");
  for(n=1; n <= max; n++){
    val[n] = 10**int(n/2) * (n%2?1:.5);
  }
}
{
  num = $0;
  # 1. check number ( 1 <= number <= 3999 )
  if(num < 1 || 3999 < num){
    print "out of range 1~3999: " num;
    next
  }
  rom_str = "";
  # 2. check number with 10 times only (1000, 100, 10, and 1)
  #    max=7, and V[7] = 1000, V[5]=100, ...
  for(n = max; n > 0; n -= 2){
    if(num >= val[n]){
      multi = int(num / val[n]);
      num %= val[n];
      # 3. for special number 4 and 9
      #   4xx = 100 and 500  = CD  (Note: multi=4, rom[5] and rom[5+1], n=5)
      #   9xx = 100 and 1000 = CM  (Note: multi=9, rom[5] and rom[5+2], n=5)
      #   rom[5] = C, val[5] = 100   , n =5
      #   rom[6] = D, val[6] = 500   , n+1=6
      #   rom[7] = M, val[7] = 1000 , n+2=7
      if(multi %5 == 4){
        rom_str = rom_str rom[n] rom[n+(multi>5?2:1)];
        continue;
      }
     #4. more than number 5
     #  6x = 50 and 1x = LX   (Note: multi=6 ==> rom[3+1] and multi=6-5=1)
     #  7x = 50 and 2x = LXX  (Note: Multi=7 ==> rom[3+1] and multi=7-5=2)
     #  rom[3] = X, val[3] = 10,  n=3
     #  rom[4] = L, val[4] = 50,  n+1=4
     if(multi >= 5){
       rom_str = rom_str rom[n+1];
       multi -= 5;
     }
     # for normal number
     for(c=1; c <= multi; c++)
       rom_str = rom_str rom[n]
    }
  }
  print rom_str
}' FILE
VI
LXXVI
CDXCIX
MMMDCCCLXXXVIII
IX
XX
out of range 1~3999: 4000
out of range 1~3999: 0
out of range 1~3999: -1

$ cat FILE
6
76
499
3888
9
20
4000
0
-1

   
作者: substr函数    时间: 2015-06-15 19:59
这是我的python2代码,比较幼稚有些地方很不严谨高手请蛋定
  1. #!/usr/bin/python2

  2. ROM = [['I', 'V'], ['X', 'L'], ['C', 'D'], ['M']]
  3. GEN = lambda a, b, c, d, e, f, r: a * ROM[b][c] + d * ROM[e][f] + r
  4. LAM = [[3, lambda m, i, r: (0, i, 0, m, i, 0, r)],
  5.        [5, lambda m, i, r: (1, i, 0, 5 - m, i, 1, r)],
  6.        [8, lambda m, i, r: (1, i, 1, m - 5, i, 0, r)],
  7.        [9, lambda m, i, r: (10 - m, i, 0, 1, i + 1, 0, r)]]

  8. def A2R(n, i=0, R=''):
  9.     if n is 0: return R
  10.     n, m = divmod(n, 10)
  11.     return A2R(n, i + 1, GEN(*next(l(m, i, R) for v, l in LAM if m <= v)))


  12. test = [6, 9, 10, 11, 76, 499, 3888]
  13. good = ['VI', 'IX', 'X', 'XI', 'LXXVI', 'CDXCIX', 'MMMDCCCLXXXVIII']

  14. for I, N in enumerate(test):
  15.     rom = A2R(N)
  16.     print N, '=', rom, ':', rom == good[I]

复制代码

作者: ichenxiaohu    时间: 2015-06-15 21:30
dfgsdg hsdfgh
作者: lichmama    时间: 2015-06-17 11:20
  1. #-*- coding:utf8 -*-

  2. def arab_to_roma(targ):
  3.     nums = [1000, 500, 100, 50, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
  4.     roma = {1000:'M', 500:'D', 100:'C', 50:'L', 10:'X',
  5.             9:'IX', 8:'VIII', 7:'VII', 6:'VI', 5:'V',
  6.             4:'IV',3:'III', 2:'II', 1:'I'}
  7.     answ = {}

  8.     for item in nums:
  9.         while targ >= item:
  10.             if not answ.has_key(item):
  11.                 answ[item] = 1
  12.             else:
  13.                 answ[item] += 1
  14.             targ -= item

  15.     return (''.join([roma[key]*answ[key] for key in sorted(answ, reverse=True)]))

  16. if __name__ == '__main__':
  17.     arab = [6, 76, 499, 3888]
  18.     for item in arab:
  19.         print arab_to_roma(item)
复制代码

作者: yestreenstars    时间: 2015-06-17 22:49
回复 34# substr函数

这脚本有问题哈~5的时候有问题~
   
作者: yestreenstars    时间: 2015-06-17 22:54
回复 36# lichmama

你这脚本也有问题哦~不只是499时有问题,其他很多转化都有问题~
   
作者: lichmama    时间: 2015-06-18 10:39
回复 38# yestreenstars


    是的,没注意到还有其他规则。
作者: hjfeng1988    时间: 2015-06-18 10:55
回复 16# ly5066113


    好猥琐的枚举法
作者: yestreenstars    时间: 2015-06-18 14:47
回复 40# hjfeng1988

怎么可以这样说Tim大师~ @ly5066113
   
作者: substr函数    时间: 2015-06-18 14:57
回复 37# yestreenstars

刚开始学,不太精通,勉强啊

  1. #!/usr/bin/python2

  2. ROM = [['I', 'V'], ['X', 'L'], ['C', 'D'], ['M']]
  3. GEN = lambda a, b, c, d, e, f, r: a * ROM[b][c] + d * ROM[e][f] + r
  4. LAM = [[3, lambda m, i, r: (0, i, 0, m, i, 0, r)],
  5.        [4, lambda m, i, r: (1, i, 0, 5 - m, i, 1, r)],
  6.        [5, lambda m, i, r: (0, i, 0, 1, i, 1, r)],
  7.        [8, lambda m, i, r: (1, i, 1, m - 5, i, 0, r)],
  8.        [9, lambda m, i, r: (10 - m, i, 0, 1, i + 1, 0, r)]]

  9. def A2R(n, i=0, R=''):
  10.     if n is 0: return R
  11.     n, m = divmod(n, 10)
  12.     return A2R(n, i + 1, GEN(*next(l(m, i, R) for v, l in LAM if m <= v)))


  13. test = [1, 4, 5, 6, 9, 10, 11, 76, 499, 3888]
  14. good = ['I', 'IV', 'V', 'VI', 'IX', 'X', 'XI', 'LXXVI', 'CDXCIX', 'MMMDCCCLXXXVIII']

  15. for I, N in enumerate(test):
  16.     rom = A2R(N)
  17.     print N, '=', rom, ':', rom == good[I]

复制代码


  1. 1 = I : True
  2. 4 = IV : True
  3. 5 = V : True
  4. 6 = VI : True
  5. 9 = IX : True
  6. 10 = X : True
  7. 11 = XI : True
  8. 76 = LXXVI : True
  9. 499 = CDXCIX : True
  10. 3888 = MMMDCCCLXXXVIII : True
复制代码

作者: hjfeng1988    时间: 2015-06-18 14:57
回复 41# yestreenstars


    记得看过一个帖子,要求计算1+2+3+....+100,然后大家各种循环。有一高人写出:sum=(1+n)*n*2。哈哈
作者: liion631818    时间: 2015-06-18 15:16
本帖最后由 liion631818 于 2015-06-18 15:17 编辑

回复 1# yestreenstars
  1. function romanConvert(){
  2.         roman1=$1
  3.         roman5=$2
  4.         roman10=$3
  5.         bit=$4
  6.        
  7.         if [[ $bit < 4 ]]; then
  8.                 for((k=0; k<$bit; k++)); do
  9.                         echo -n $roman1
  10.                 done
  11.         elif [[ $bit == 4 ]]; then
  12.                 echo -n $roman1$roman5
  13.         elif [[ $bit == 5 ]]; then
  14.                 echo -n $roman5
  15.         elif [[ $bit > 5 && $bit < 9 ]]; then
  16.                 echo -n $roman5
  17.                 for((k=0; k<$bit-5; k++)); do
  18.                         echo -n $roman1
  19.                 done
  20.         elif [[ $bit == 9 ]]; then
  21.                 echo -n $roman1$roman10
  22.         elif [[ $bit == 10 ]]; then
  23.                 echo -n $roman10
  24.         fi
  25. }


  26. function decimal2RomanNumeral(){
  27.         read -p "please enter decimal numeric: " dec_numeric

  28.         echo $dec_numeric | grep "[^0-9]" 1>/dev/null 2>&1

  29.         if [ $? -eq 0 ]; then
  30.                 echo "ERROR: not numeric"
  31.                 exit
  32.         fi

  33.         len=${#dec_numeric}

  34.         if [ $len -eq 0 ] || [ $len -gt 4 ]; then
  35.                 echo "ERROR: numeric too little or big"
  36.                 exit
  37.         fi
  38.        
  39.         if [ $dec_numeric -lt 0 ] || [ $dec_numeric -gt 3999 ]; then
  40.                 echo "ERROR: 0 < n < 3999"
  41.                 exit
  42.         fi
  43.        
  44.         for((i=0; i<$len; i++)); do
  45.                 bit=${dec_numeric:i:1}
  46.                 digits=$((len-i))
  47.                
  48.                 #echo covert $bit in $digits
  49.                
  50.                 if [[ $digits == 4 ]]; then
  51.                         romanConvert M M M $bit
  52.                 elif [[ $digits == 3 ]]; then
  53.                         romanConvert C D M $bit
  54.                 elif [[ $digits == 2 ]]; then
  55.                         romanConvert X L C $bit
  56.                 elif [[ $digits == 1 ]]; then
  57.                         romanConvert I V X $bit
  58.                 fi
  59.                
  60.         done
  61.        
  62.         echo
  63.        
  64. }

  65. decimal2RomanNumeral
复制代码
  1. px@ubuntu:~/bash-script$ ./myscript.sh
  2. please enter decimal numeric: 1
  3. I
  4. px@ubuntu:~/bash-script$ ./myscript.sh
  5. please enter decimal numeric: 5
  6. V
  7. px@ubuntu:~/bash-script$ ./myscript.sh
  8. please enter decimal numeric: 9
  9. IX
  10. px@ubuntu:~/bash-script$ ./myscript.sh
  11. please enter decimal numeric: 10
  12. X
  13. px@ubuntu:~/bash-script$ ./myscript.sh
  14. please enter decimal numeric: 19
  15. XIX
  16. px@ubuntu:~/bash-script$ ./myscript.sh
  17. please enter decimal numeric: 20
  18. XX
  19. px@ubuntu:~/bash-script$ ./myscript.sh
  20. please enter decimal numeric: 21
  21. XXI
  22. px@ubuntu:~/bash-script$ ./myscript.sh
  23. please enter decimal numeric: 99
  24. XCIX
  25. px@ubuntu:~/bash-script$ ./myscript.sh
  26. please enter decimal numeric: 499
  27. CDXCIX
  28. px@ubuntu:~/bash-script$ ./myscript.sh
  29. please enter decimal numeric: 0499
  30. CDXCIX
  31. px@ubuntu:~/bash-script$ ./myscript.sh
  32. please enter decimal numeric: 3888
  33. MMMDCCCLXXXVIII
复制代码

作者: yestreenstars    时间: 2015-06-18 15:39
回复 43# hjfeng1988

这公式不是在初中就已经学过了吗~
   
作者: yestreenstars    时间: 2015-06-18 15:42
回复 42# substr函数

这次的没问题了~
   
作者: little_angel    时间: 2015-06-25 09:36
瞧瞧~~~~。。。。。。。。。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2