12.go 1.4 KB

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