zoukankan      html  css  js  c++  java
  • 在C#中模拟大数乘法

    今天见一道算法题,要求实现两个不限长度的正整数的乘法。感觉不难,便顺手做了一下。我这里的实现比较简单,基本上就是模拟算术运算,大概分成如下几步

      125
    x  11
    -------
      125
     125
    --------
     1375

    1. 将乘数每位与乘数相乘,获取到一个m*n的矩阵
    2. 将矩阵错位相加,得到输出数组
    3. 对输出中数组进行进位运算

    一个简单的实现如下

        static string Multiplication(string num1, string num2)
        {
            var input1 = num1.Select(i => (int)(i - '0'));
            var input2 = num2.Select(i => (int)(i - '0'));

            //
    num1依次和num2每位相乘,获取到一个m*n的矩阵
            var rectangel = input2.Select(i => input1.Select(j => j * i).ToArray()).ToArray();

            //
    将矩阵错位相加,得到输出数组
            var result = new int[num1.Length + num2.Length];
            for (int row = 0; row < num2.Length; row++)
            {
                for (int column = 0; column < num1.Length; column++)
                {
                    result[column + row + 1] += rectangel[row][column];
                }
            }

            //
    对输出中数组进行进位运算
            for (int i = result.Length - 1; i >= 0; i--)
            {
                if (result[i] < 10)
                    continue;

                result[i - 1] += result[i] / 10;
                result[i] %= 10;
            }

            return new string(result.Select(i => (char)(i += '0')).ToArray());
        }

    当然,这个只是一个算法练习,真正在实际应用中如果用到了大数运算是没必要用这个重复轮子的,在.net 4.0中引入了System.Numerics.BigInteger结构,可以实现不限长度的大数运算,比我的这个潦草地实现要凶猛得多的。

  • 相关阅读:
    printf和sprintf
    操作数、运算符、表达式
    全自动加法机
    Ascll、GB2312、Ansi
    数组
    循环
    编程命名规范
    浮点数及缺陷
    Android编码规范
    RGB着色对照表
  • 原文地址:https://www.cnblogs.com/TianFang/p/2382830.html
Copyright © 2011-2022 走看看