美文网首页
两个大位数相乘问题

两个大位数相乘问题

作者: Herman7z | 来源:发表于2018-06-26 16:17 被阅读0次

模拟乘法累加

  • 第一步,是将乘数与被乘数逐位相乘;
  • 第二步,将逐位相乘得到的结果,对应相加起来,这一步不考虑进位。
  • 第三步,从后面开始循环遍历,n/10 表示进位数,n%10 表示当前位的值
        9  8
×       2  1
-------------
       (9)(8)  <---- 第1趟: 98×1的每一位结果 
  (18)(16)     <---- 第2趟: 98×2的每一位结果 
-------------
  (18)(25)(8)  <---- 这里就是相对位的和,还没有累加进位 

代码实现:

/**
     * 两个大数相乘算法
     *
     * @param numberStr1
     * @param numberStr2
     * @return
     */
    public static String bigIntMultiply(String numberStr1, String numberStr2) {
        int[] numberInt1 = charArray2IntArray(numberStr1.toCharArray());
        int[] numberInt2 = charArray2IntArray(numberStr2.toCharArray());

        int[] result = new int[numberInt1.length + numberInt2.length];

        for (int j = numberInt2.length - 1; j >= 0; j--) {
            int[] array = new int[numberInt1.length + numberInt2.length - 1 - j];  //numberInt2.length - 1 - j 表示后面需要补0 的位数
            int i = numberInt1.length - 1;
            for (; i >= 0; i--) {
                array[i] = numberInt2[j] * numberInt1[i];
            }
            result = arrayAdd(result, array);  //两个数组相加
        }

        //处理进位问题
        for (int k = result.length - 1; k >= 0; k--) {
            int n = result[k] / 10;
            int m = result[k] % 10;
            result[k] = m;
            if (n != 0) {
                result[k - 1] = n + result[k - 1];
            }
        }

        return Arrays.toString(result).replace(", ", "").replace("[", "").replace("]", "").replaceFirst("^(0+)", "");
    }

    /**
     * 两个数组相加
     *
     * @param array1
     * @param array2
     * @return
     */
    private static int[] arrayAdd(int[] array1, int[] array2) {
        int k = 1;
        int[] result = new int[array1.length > array2.length ? array1.length + 1 : array2.length + 1];
        while (true) {
            int n = 0;
            if (array1.length - k >= 0) {
                n = array1[array1.length - k];
            }
            int m = 0;
            if (array2.length - k >= 0) {
                m = array2[array2.length - k];
            }
            if (n == 0 && m == 0) {
                break;
            }
            result[result.length - k++] = m + n;
        }
        return result;
    }


    private static int[] charArray2IntArray(char[] array) {
        int length = array.length;
        int[] result = new int[length];
        for (int i = 0; i < length; i++) {
            result[i] = array[i] - '0';
        }
        return result;
    }

相关文章

  • 两个大位数相乘问题

    模拟乘法累加 第一步,是将乘数与被乘数逐位相乘; 第二步,将逐位相乘得到的结果,对应相加起来,这一步不考虑进位。 ...

  • 【心算】任意两位数与11相乘

    任意两位数与11相乘 从标题可以得出,任意两位数与11相乘的结果范围是:110~1089 最小的两位数是10, 1...

  • 两位数相乘

    这次中心图选择了比较简单又能与主题联想相关的图案,绘制上很快就完成了,比较难的是对于关键词的理解,特别是我这种数...

  • 两位数相乘

    【第8次作业】 作业内容: 45分钟《数学知识点》思维导图练习 人教版小学数学三年级下册知识点 第五单元 两位数乘...

  • 我和儿子“赛”做题

    晚上检查儿子作业时,我发现儿子在算一个两位数和一个整十的两位数相乘时比较麻烦,如:91和30相乘,他先用个位数...

  • 大数相乘、大数相加、大数相减(Java版)

    大数相乘 假设有A和B两个大数,位数分别为a和b。根据我们平常手动计算乘法的方式可以看出,最终的结果的位数c一定小...

  • 两位数的乘法快捷算法

    通用的两位数计算法 计算过程 (数a x 数b) 个位相乘: a个位数 x b个位数 = 结果1,结果1以个位为基...

  • 苏教版三年级下册数学第一单元《两位数乘两位数》

    知识点1:两位数乘整十数的口算 两位数乘整十数的口算方法:先用整十数0前面的数与两位数相乘,计算出结果后,再在积的...

  • 乘法速算技巧

    1. 十位数相同,个位数互补的两位数乘法 口诀:十位加一乘十位,个位数相乘写后面。 同义口诀:一个头加1后,头乘头...

  • 思维导图和数学教学

    两位数乘于两位数 遇到整十整百的数,我们用口算就可以解决,0前面的数相乘,因数中一共有几个0,乘积后面就加几个0。...

网友评论

      本文标题:两个大位数相乘问题

      本文链接:https://www.haomeiwen.com/subject/kadmyftx.html