[C#] Сложение больших чисел и умножение больших чисел

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

 

おすすめ

転載: blog.csdn.net/weixin_61427881/article/details/128009406