首页 > 其他分享 >两个特别大的数字相乘

两个特别大的数字相乘

时间:2022-11-17 23:00:36浏览次数:44  
标签:特别 数字 s2 相加 length 相乘 String

两个大数字相乘与两个大数字相加思路是相同的,不过逻辑可能麻烦点,首先我们先设计下

1、两个大数字相乘,无非也是转换为数组进行相乘,但是两个数组相乘循环遍历相加,太繁琐了,容易出错,所以我们使用一个数组与一个数字相乘,然后把这些结果相加,那么问题就可以解决了,下面我们在编写一个数组与一个数字相乘的代码,当然,末尾的数字是直接相乘即可,但是前面的呢?后面肯定要加0啊,于是要有一个offset,记录相加计算之后后面再添加几个0.

2、一个数组与一个数字相乘,这个就稍微简单一点了。也就是遍历数组,然后与每个数字相乘,然后加在一起,但是,除了末尾,其他相加后面可能还要补0,所以,我们在定义一个方法专门计算一个数字与一个数字相乘,然后再补0,这样就很简单明了了。

3、定义一个数字与一个数字相乘,加上一个补零的操作,这个应该是so easy,转换之后乘一下,遍历补0就好。

下面分享下代码,希望大家多多指教。

首先还是要相加的代码的,把上次的代码拿过来

//两个大数字相加
public static String numberPlus(String s1, String s2) {

    //将数字转换成char类型的数组,然后每一位进行运算
    char[] char1;
    char[] char2;
 
    //计算前区分,令char1 为长的那个字符创转换成的数组.+
    if (s1.length() > s2.length()) {
        char1 = s1.toCharArray();
        char2 = s2.toCharArray();
    } else {
        char1 = s2.toCharArray();
        char2 = s1.toCharArray();
    }
    //flag 进位标识,末位相加进位的话前面一位需要加上进位
    int flag = 0;
    //创建一个list接收两个数组相加的结果
    List<Integer> resultList = new ArrayList<>();
    //遍历相加
    for (int i = char1.length - 1; i >= 0; i--) {
        //字母与数字之间的类型转换
        int a = Integer.parseInt(String.valueOf(char1[i]));
        //初始化,数组char2 短一些
        int b = 0;
        //计算,使得char1与char2 末位相加
        if (i - (char1.length - char2.length) >= 0) {
            b = Integer.parseInt(String.valueOf(char2[i - (char1.length - char2.length)]));
        }
        //两个数字相加,同时加上进位,
        //注意:flag 的设置一定要放在相加后面,因为相加要使用当前的flag,如果提前设置,flag的作用就没有起到。
        resultList.add((a + b + flag) % 10);
        flag = (a + b + flag) / 10;
    }
    //最后进位处理
    if(flag!=0){
        resultList.add(flag);
    }
 
    StringBuffer buffer = new StringBuffer();
    //逆向遍历,因为加的时候是从末位开始加的,首位的在后面。
    for (int i = resultList.size() - 1; i >= 0; i--) {
        buffer.append(resultList.get(i));
    }
    //相加结果字符串返回。
    return buffer.toString();
}

然后就开始编写第三步的代码,一个数字与一个数字相乘,然后补0

//计算某位与一个数字相乘:s1:某位的数字,s2:相乘的数字,offset:就是后面
    //要补几个零
    public static String mulit(String s1, String s2, Integer offset) {
        //s1与s2都必须是一位,否则直接返回空
        if (s1.length() != 1 || s2.length() != 1) {
            return null;
        }
        int num = Integer.parseInt(s1) * Integer.parseInt(s2);
        StringBuffer buffer = new StringBuffer(String.valueOf(num));
        if (offset >= 1) {
            for (int i = 1; i <= offset; i++) {
                buffer.append("0");
            }
        }
        return buffer.toString();
    }

接着计算一个数组与一个数字相乘,同时也要补0

//一个数组与一个数字相乘
    public static String numMulit(char[] chars, String s, Integer offset) {
 
        if (s.length() != 1) {
            return null;
        }
 
        String result = "0";
        for (int i = chars.length - 1; i >= 0; i--) {
            String temp = mulit(String.valueOf(chars[i]), s, chars.length - i - 1);
            result = numberPlus(temp, result);
        }
        StringBuffer buffer = new StringBuffer(result);
        if (offset >= 1) {
            for (int i = 1; i <= offset; i++) {
                buffer.append("0");
            }
        }
        return buffer.toString();
    }

最后计算两个数组相乘

//两个大数字相乘
    public static String numMulitfy(String s1, String s2) {
 
        char[] chars1 = s1.toCharArray();
        char[] chars2 = s2.toCharArray();
 
        String result = "0";
 
        for (int i = chars1.length - 1; i >= 0; i--) {
            String temp = numMulit(chars2, String.valueOf(chars1[i]), chars1.length - i - 1);
            result = numberPlus(result, temp);
        }
        return result.toString();
    }

标签:特别,数字,s2,相加,length,相乘,String
From: https://www.cnblogs.com/testero/p/16695802.html

相关文章