大数的四则运算之乘法----Java代码实现

声明:此篇文章完全参考博文:http://blog.csdn.net/sunkun2013/article/details/11822927的大数相乘思想,此博主用图文的形式详细介绍了大数相乘的思想,在参考次博文的基础上,自己编写并实现大数相乘,现将java实现的代码给出,以便以后自己的参考学习;
主要代码的实现

    /**
     * 高精度乘法函数  
     * 参考:http://blog.csdn.net/sunkun2013/article/details/11822927
     * @param str1
     * @param str2
     */
    public static int[] multiply(char[] ch1,char[] ch2,int len1,int len2) { 
        //1.构造各位乘数的二维数组
        int[][] temp = new int[len1][len2];
        for (int i = 0; i < len1; i++) {
            for (int j = 0; j < len2; j++) {
                int c1 = Integer.parseInt(String.valueOf(ch1[i]));
                int c2 = Integer.parseInt(String.valueOf(ch2[j]));
                temp[i][j] = c1*c2;
            }
        }

        //2.计算算术和,不考虑进位
        int[] r = new int[len1+len2-1];   //保存错位相加的数字
        for (int k = 0; k < r.length; k++) {
            for (int i = 0; i < len1; i++) {
                for (int j = 0; j < len2; j++) {
                    if (i+j == k) {   //重点:和计算条件
                        r[k] += temp[i][j];
                    }
                }
            }
        }

        //处理进位问题:保留各位,十位进位相加
        for (int k = r.length-1; k >= 0; k--) {
            if (r[k] > 9) {
                r[k-1] = r[k]/10+r[k-1];
                r[k] = r[k]%10;
            }
        }
        return r;
    }

符号位的判断和处理

/**
     * 存储在字符串中的两个大数运算
     * @param str1
     * @param str2
     */
    public static void bigDateCalculate(String str1,String str2) {
        //1.消除数据的正负号
        int i = 0,j=0;
        StringBuffer result = new StringBuffer("");  //保存计算结果
        //单引号是char类型的数据(只能是单个字符),双引号是String类型的数据
        if (str1.charAt(0) == '-') {
            str1 = str1.substring(1);
            i++;
        }
        if (str2.charAt(0) == '-') {
            str2 = str2.substring(1);
            j++;
        }

        //2.加减乘除方法前都会计算这几个参数
        int len1 = str1.length();
        int len2 = str2.length();
        char[] ch1 = str1.toCharArray();
        char[] ch2 = str2.toCharArray();

        //除正负号外的大数乘法运算
        int[] tempResult = multiply(ch1, ch2, len1, len2);


        if (i+j == 1) {  //i+j==1表示两个数为异号
            result.append("-");
            for (int k = 0; k < tempResult.length; k++) {
                result.append(tempResult[k]);
            }   
        } else {
            for (int k = 0; k < tempResult.length; k++) {
                result.append(tempResult[k]);
            }
        }
        System.out.println("两个大数相乘的结果为:"+ result);
    }

主函数

    public static void main(String[] args) {
        String str1 = "    234567890098776665555444449999999";
        String str2 = "946587436598437594375943875943875";
        str1 = str1.trim(); //排除空格
        str2 = str2.trim();
        bigDateCalculate(str1, str2);
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值