Preguntas sobre el cepillado del botón de encendido: 12. Convierta un entero en un número romano

Requisitos de la asignatura

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Código: miles, centenas, decenas y unidades se procesan en secuencia

class Solution {
    
    
public:
    map<int,string> m;
    string intToRoman(int num) {
    
    
        string roman;
        //存储数字各个位(个位、十位、百位)上的数
        int bitNumber;
        mapInit();

        bitNumber = num / 1000;
        strRomanFun(roman, bitNumber, 1000);
        num %= 1000;

        bitNumber = num / 100;
        strRomanFun(roman, bitNumber, 100);
        num %= 100;

        bitNumber = num / 10;
        strRomanFun(roman, bitNumber, 10);
        num %= 10;

        bitNumber = num / 1;
        strRomanFun(roman, bitNumber, 1);
        num %= 1;
        return roman;
    }

    void mapInit()
    {
    
    
        m[1] = "I";
        m[4] = "IV";
        m[5] = "V";
        m[9] = "IX";

        m[10] = "X";
        m[40] = "XL";
        m[50] = "L";
        m[90] = "XC";

        m[100] = "C";
        m[400] = "CD";
        m[500] = "D";
        m[900] = "CM";

        m[1000] = "M";
    }
    void strRomanFun(string& Roman, int bitNumber, int bit)
    {
    
    
        if (bitNumber == 4)
        {
    
    
            Roman += m[4 * bit];
        }
        else if (bitNumber == 9)
        {
    
    
            Roman += m[9 * bit];
        }
        else
        {
    
    
            if (bitNumber / 5)
            {
    
    
                Roman += m[5 * bit];
            }
            for (size_t i = 0; i < (bitNumber%5); i++)
            {
    
    
                Roman += m[bit];
            }
        }
    }
};

Prediseñado

Se define un mapa de variables miembro en la clase para que las tres funciones puedan acceder fácilmente al mapa.
La función de subfunción mapInit es responsable de inicializar la
función de subfunción de mapa strRomanFun es responsable de agregar la cadena bit a bit

toda la idea

Primero defina un mapa, que almacena números y los caracteres romanos correspondientes.
Luego, realice la conversión de caracteres romanos en el orden de miles, centenas, decenas y unidades:

  • Si el número en este bit es igual a 0 , omita este bit
  • Si el número en este bit es mayor que 0 y menor que 4 , agregue el número correspondiente del bit 'valor 1' después de la cadena
  • Si el número en este bit es igual a 4 , agregue el 'valor 4' de este bit después de la cadena
  • Si el número en este bit es mayor que 4 y menor que 9 , agregue el 'valor 5' de este bit y el 'valor 1' restante después de la cadena
  • Si el número en este bit es igual a 9 , agregue el 'valor 9' de este bit después de la cadena

Tome 1994 como ejemplo: la
cadena está inicialmente vacía al principio

El primero es el número 1 en el lugar de los miles, porque 1 es mayor que 0 y menor que 4, por lo que se debe agregar un 'valor 1' en el lugar de los miles después de la cadena, es decir, 'M'. "METRO"

El siguiente es el número 9 en el dígito de las centenas, y el "valor 9" en el dígito de las centenas se agrega al final de la cadena, que es el "CM" de 900. "MCM"

El siguiente es el número 0 en el lugar de la decena, y el 'valor 9' de la decena se agrega al final de la cadena, que es el 'XC' de 90. "MCMXC"

El último es el número 4 en el dígito de las unidades, y el 'valor 4' del dígito de las unidades se agrega al final de la cadena, que es el 'IV' de 4. "MCMXCIV"

Que aprendí

1. Reaprendí el método de insertar elementos en el mapa.

  • Inserte par con inserto
  • Insertar value_type con insertar
  • Usar método de matriz

m[1] = "I";

En esta pregunta, utilicé el tercer método. Cabe señalar que si hay un valor en el mapa, este método sobrescribirá el valor anterior.

Artículos de referencia para operaciones de contenedor de mapas

resultado

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/youyadefeng1/article/details/113406290
Recomendado
Clasificación