12.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package main
  2. import (
  3. "bytes"
  4. "math"
  5. )
  6. var mRoman = map[float64]rune{
  7. 1: 'I',
  8. 5: 'V',
  9. 10: 'X',
  10. 50: 'L',
  11. 100: 'C',
  12. 500: 'D',
  13. 1000: 'M',
  14. }
  15. func digitToRoman(pos, digit int) []rune {
  16. res := make([]rune, 0)
  17. base := math.Pow10(pos)
  18. switch digit {
  19. case 0:
  20. case 1:
  21. fallthrough
  22. case 2:
  23. fallthrough
  24. case 3:
  25. for i := 0; i < digit; i++ {
  26. res = append(res, mRoman[base])
  27. }
  28. case 4:
  29. res = append(res, mRoman[base], mRoman[base*5])
  30. case 5:
  31. fallthrough
  32. case 6:
  33. fallthrough
  34. case 7:
  35. fallthrough
  36. case 8:
  37. res = append(res, mRoman[base*5])
  38. for i := 5; i < digit; i++ {
  39. res = append(res, mRoman[base])
  40. }
  41. case 9:
  42. res = append(res, mRoman[base], mRoman[base*10])
  43. default:
  44. }
  45. return res
  46. }
  47. func intToRomanOld(num int) string {
  48. res := make([]rune, 0)
  49. for i := 0; num != 0; i, num = i+1, num/10 {
  50. roman := digitToRoman(i, num%10)
  51. res = append(roman, res...)
  52. }
  53. return string(res)
  54. }
  55. var roman = [4][10]string{
  56. {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"},
  57. {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"},
  58. {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"},
  59. {"", "M", "MM", "MMM"},
  60. }
  61. func intToRoman(num int) string {
  62. var res bytes.Buffer
  63. res.WriteString(roman[3][num/1000])
  64. res.WriteString(roman[2][num%1000/100])
  65. res.WriteString(roman[1][num%100/10])
  66. res.WriteString(roman[0][num%10])
  67. return res.String()
  68. }
  69. /* func main() {
  70. fmt.Println(intToRoman(1998))
  71. } */