1) Добавить два числа
Сложение двух чисел фактически представляет собой сложение из разряда единиц с учетом переноса, как показано на рисунке ниже:
Мы можем рассматривать 9 3 4 и 9 7 в приведенном выше примере как два массива соответственно, и цикл начинает добавление с конца массива и использует переменную флага для записи переноса:
шаг 1: добавьте цифру единиц
4 + 7 = 11, 11 разделить на 10 = 1 остаток 1, должен нести 1, остаток 1 как единичный разряд результата
шаг 2: добавьте десять цифр
3 + 9 + 1 (1 добавляется к разряду единиц) = 13, 13 разделить на 10 = 1 с остатком 3, который следует перенести с 1, а остаток 3 представляет собой разряд десятков результата
Шаг 3: добавить сотни
9 + 0 + 1 (1 добавляется к разряду десятков) = 10, 10 делится на 10 = 1 с остатком 0, который должен переноситься с 1, а остаток 0 используется как разряд сотен результата
Шаг 4: добавить тысячи
0 + 0 + 1 (1 добавляется к разряду сотен) = 1, 1 делится на 10 = 0 с остатком 1, перенос не требуется, а остаток 1 — это тысячная цифра результата
шаг 5: добавьте десять тысяч цифр
Поскольку все десять тысяч цифр равны 0 и переноса нет, завершите операцию.
Результат 1 0 3 1.
Согласно этой идее, код добавления текстовых строк выглядит следующим образом:
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) Умножить два числа
Этот вопрос включает в себя только умножение большого числа и малого числа, что можно рассматривать как умножение каждой цифры малого числа на большое число с учетом переноса, как показано на рисунке ниже:
Конкретная операция аналогична операции сложения.
Шаг 1: умножьте десятичные и большие числа
97 * 4 = 388, 388 разделить на 10 = 38 с остатком 8, который следует перевести в 38, а остаток 8 - это единичная цифра результата
Шаг 2: Умножьте десятки цифр десятичного и большого числа
97 * 3 + 38 (38 получается путем умножения разряда единиц) = 329, 329 разделить на 10 = 32 с остатком 9, который следует перевести в 32, а остаток 9 использовать как разряд десятков результата
Шаг 3: Умножьте сотни десятичных знаков и большие числа
97 * 9 + 32 (32 умножить на десятки) = 905, 905 разделить на 10 = 90 с остатком 5, который нужно перевести в 90, а остаток 5 использовать как разряд сотен результата
Шаг 4: Умножьте тысячи десятичных знаков и больших чисел
97 * 0 + 90 (90 умножить на сотни) = 90, 90 разделить на 10 = 9 с остатком 0, который должен быть перенесен с 9, с остатком 0 как цифра тысяч результата
Шаг 5: Умножьте десятки тысяч десятичных и больших чисел
97 * 0 + 9 (9 умножить на тысячи) = 9, 9 разделить на 10 = 0 с остатком 9, перенос не требуется, а остаток 9 - это десятки тысяч результата
Шаг 6: завершение операции
Результат 9 0 5 9 8.
Код аналогичен коду добавления
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;
}