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;
}