[C#] Suma de números grandes y multiplicación de números grandes

1) Sumar dos números

La suma de dos números en realidad es sumar desde el dígito de las unidades y considerando el acarreo, como se muestra en la siguiente figura:

Podemos considerar 9 3 4 y 9 7 en el ejemplo anterior como dos matrices respectivamente, y el ciclo comienza a agregarse desde el final de la matriz y usa una variable indicadora para registrar el acarreo:

paso 1: sumar el dígito de las unidades

4 + 7 = 11, 11 dividido por 10 = 1 resto 1, debe llevar 1, resto 1 como dígito unitario del resultado

paso 2: agregar diez dígitos

3 + 9 + 1 (1 sumado al dígito de las unidades) = 13, 13 dividido por 10 = 1 con un resto de 3, que debe llevarse con 1, y el resto 3 es el dígito de las decenas del resultado

paso 3: sumar cientos

9 + 0 + 1 (1 sumado al dígito de las decenas) = ​​10, 10 dividido por 10 = 1 con un resto de 0, que debe llevarse con 1, y el resto de 0 se usa como el dígito de las centenas del resultado

paso 4: agregar miles

0 + 0 + 1 (1 sumado al bit de las centenas) = ​​1, 1 dividido por 10 = 0 con un resto de 1, no se requiere acarreo, y el resto de 1 es el dígito de mil del resultado

paso 5: suma diez mil dígitos

Como los diez mil dígitos son todos 0 y no hay acarreo, termine la operación

El resultado es 1 0 3 1.

De acuerdo con esta idea, el código para agregar cadenas de texto es el siguiente:

public string AddStr(string a, string b)
        {
            //将a和b的每一位数存进数组
            char[] aNums = a.ToCharArray();
            char[] bNums = b.ToCharArray();
            
            string result  = "";

            //进位标志
            byte flag = 0;

            //用一个List类型来储存计算结果的每一位
            List<byte> resultList = new List<byte>();

            int i = 0;

            //从a、b数组的末尾开始进行循环相加
            while((i < Math.Max(a.Length, b.Length)) || (flag != 0) )
            { 
                byte ai = 0, bi = 0;
                if (i < a.Length)
                {
                    ai = byte.Parse(aNums[a.Length - 1 - i].ToString());
                }
                if (i < b.Length)
                {
                    bi = byte.Parse(bNums[b.Length - 1 - i].ToString());
                }
                //ai + bi + flag除以10的余数是当前位的结果
                resultList.Add((byte)((ai + bi + flag) % 10));
                //ai + bi + flag除以10向下取整是进位
                flag = (byte)Math.Floor((double)((ai + bi + flag) / 10));
                i++;
            }
            //将list倒序赋给result
            foreach(byte bt in resultList)
            {
                result = bt + "" + result;
            }
            return result;
        }

2) Multiplicar dos números

Esta pregunta solo implica la multiplicación de un número grande y un número pequeño, lo que se puede ver como multiplicar cada dígito del número pequeño con el número grande y considerando el acarreo, como se muestra en la siguiente figura:

La operación específica es similar a la operación de suma.

paso1: Multiplicar los del decimal y el numero grande

97 * 4 = 388, 388 dividido por 10 = 38 con un resto de 8, que debe llevarse a 38, y el resto de 8 es el dígito de la unidad del resultado

paso 2: Multiplica los dígitos de las decenas del decimal y el número grande

97 * 3 + 38 (38 obtenido al multiplicar el dígito de la unidad) = 329, 329 dividido por 10 = 32 con un resto de 9, que debe llevarse a 32, y el resto de 9 se usa como el dígito de las decenas del resultado

paso3: Multiplica las centenas de decimales y números grandes

97 * 9 + 32 (32 multiplicado por decenas) = ​​905, 905 dividido por 10 = 90 con un resto de 5, que debe llevarse a 90, y el resto de 5 se usa como el lugar de las centenas del resultado

paso4: Multiplica los miles de decimales y números grandes

97 * 0 + 90 (90 multiplicado por centenas) = ​​90, 90 dividido por 10 = 9 con un resto de 0, que debe llevarse con 9, con un resto de 0 como el dígito de los miles del resultado

paso5: Multiplica las decenas de miles de decimales y números grandes

97 * 0 + 9 (9 multiplicado por miles) = 9, 9 dividido por 10 = 0 con un resto de 9, no se requiere llevar, y el resto de 9 son las decenas de miles del resultado

paso 6: finalizar la operación

El resultado es 9 0 5 9 8.

El código es similar al código para agregar

public string MulStr(string a, byte b)
        {
            //将a的每一位数存入数组
            char[] aNums = a.ToCharArray();
            string result = "";

            //进位                
            byte flag = 0;

            //List用来存储结果的每一位
            List<byte> resultList = new List<byte>();

            int i = 0;

            //从数组的末端开始循环相乘
            while ((i < a.Length) || (flag != 0))
            {
                byte ai = 0, bi = b;
                if (i < a.Length)
                {
                    ai = byte.Parse(aNums[a.Length - 1 - i].ToString());
                }
                resultList.Add((byte)((ai * bi + flag) % 10));
                flag = (byte)Math.Floor((double)((ai * bi + flag) / 10));
                i++;
            }

            foreach (byte bt in resultList)
            {
                result = bt + "" + result;
            }
            return result;
        }

 

Supongo que te gusta

Origin blog.csdn.net/weixin_61427881/article/details/128009406
Recomendado
Clasificación