大整数乘法其实很简单(Java)

本文介绍了一种使用Java实现大整数乘法的方法,包括加、减、除的基本运算,通过模拟数学乘法过程,按位相乘并相加,处理进位,最终得到大整数的乘积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大整数乘法其实很简单(Java)

目的及介绍

  • 使用Java语言实现大整数相乘
  • 只要弄的大整数相乘,大整数相加、减、除很简单
  • 大整数相加,只需要一个循环进行进位操作
  • 大整数相减,只需要在循环内进行借位,注意正负号即可
  • 大整数相除,就是多次的大整数相减。

设计思路

  • 模拟数学上的乘法,按位相乘,最后相加
  • 相加的时候,低位超过10的,向前进位

具体步骤

  • 首先进行运算符判断,对最后结果是正负有个数
  • 人工是可以正向运算的,但是计算机进行字符串逆置,方便计算和存储
  • 对于计算的结果,需要找地方存储,新数组的大小即两个数相乘的积位数,不会大于两数位数之和
  • 进行运算和数值处理(进位)
  • 记得把多余的0去掉,还有带上正负号

代码实现

public class BigIntegersMulti {
    //大整数乘法
    public String multi(String args, String args2) {
        StringBuffer sb = new StringBuffer(args);
        StringBuffer sb2 = new StringBuffer(args2);
        //运算符判断
        int signal = 0;
        if ("-".equals(args.substring(0, 1))) {
            sb.delete(0, 1);
            signal++;
        }
        if ("-".equals(args2.substring(0, 1))) {
            sb2.delete(0, 1);
            signal++;
        }
        //字符串逆置,方便计算和存储
        char[] ch = sb.reverse().toString().toCharArray();
        char[] ch2 = sb2.reverse().toString().toCharArray();
        //两个数相乘的积位数不会大于两数位数之和
        int length = ch.length + ch2.length;
        int[] sum = new int[length];
        //运算
        for (int i = 0; i < ch.length; i++) {
            for (int j = 0; j < ch2.length; j++) {
                sum[i + j] += (ch[i] - '0') * (ch2[j] - '0');
            }
        }
        //数值整理和进位
        for (int i = 0; i < length - 1; i++) {
            sum[i + 1] += (sum[i] / 10);
            sum[i] %= 10;
        }
        StringBuffer sb3 = new StringBuffer();
        //消除0,比如000123,应该输出123
        int u = length - 1;
        while (sum[u] == 0) {
            u--;
        }
        //逆序
        for (; u >= 0; u--) {
            sb3.append(sum[u]);
        }
        //带上运算符号
        if ((signal & 1) == 1) {
            sb3.insert(0, "-");
        }
        return sb3.toString();
    }
}

测试案例设计

  • 测试负数乘以负数
  • 测试正数乘以负数
  • 通过9999,99999999的数学关系得到9的倍数关系,进行验证(两个相同的n个9组成的数相乘,结果是由n-1个9加上一个8再加上n-1个0再加上一个1组成)
public void testmulti() {

        //测试负数乘以负数
        String s1 = "-12345679", s2 = "-12345679";
        String s3 = bigIntegersMulti.multi(s1, s2);
        assert s3.equals("152415789971041");
        //测试正数乘以负数
        s1 = "12345679";
        s2 = "-12345679";
        s3 = bigIntegersMulti.multi(s1, s2);
        assert s3.equals("-152415789971041");
        //测试9的倍数关系
        StringBuffer sb = new StringBuffer();
        StringBuffer sb1 = new StringBuffer();
        sb.append(9);
        for (int i = 1; i < 20; i++) {
            sb.append(9);
            s3 = bigIntegersMulti.multi(sb.toString(), sb.toString());
            for (int j = 0; j < i; j++) {
                sb1.append(9);
            }
            sb1.append(8);
            for (int j = 0; j < i; j++) {
                sb1.append(0);
            }
            sb1.append(1);
            assert s3.equals(sb1.toString());
            sb1 = new StringBuffer();
        }
    }

排坑细节

  • 忘记加上正负号
  • 没有消除0
<think>嗯,用户想了解Java中Math类的平方和立方方法。首先,我需要回忆一下Math类里有哪些相关的方法。Math类确实提供了很多数学运算的静态方法,比如pow、sqrt等。平方和立方其实可以通过Math.pow()来实现,不过有没有更直接的方法呢? 记得在Java 8之后,Math类增加了像expm1、log1p这些,但平方和立方可能还是依赖pow。比如平方的话,Math.pow(x, 2),立方是Math.pow(x,3)。不过直接写x*x或者x*x*x可能效率更高,因为方法调用会有开销。但用户可能想知道标准库里的方法,所以重点应该放在Math.pow上。 另外,Math.sqrt(x)是平方根,不是平方,但用户问的是平方,所以可能不需要提sqrt。不过可以稍微提一下,作为补充。另外,有没有其他方法?比如Math.multiplyExact,不过那是用来乘法的,可能不适用。 需要注意,Math.pow返回的是double类型,即使参数是整数。比如计算2的3次方,结果是8.0。如果用户需要整数结果,可能需要强制转换,但可能会有精度问题,尤其是大数的时候。 还要提到一些边界情况,比如负数的立方根,或者NaN、Infinity的处理。例如,Math.pow(-2, 3)会是-8.0,而平方的话负数结果也是正数。但如果是分数次幂,可能会有问题,但平方和立方都是整数次,所以没问题。 另外,用户可能想知道有没有更高效的方法,比如对于平方,用x*x比Math.pow(x,2)更快,特别是循环中频繁调用时。这时候可以建议根据情况选择合适的方式,但标准方法还是Math.pow。 总结一下,应该分点说明平方和立方的实现方法,使用Math.pow,举例说明,并提到直接相乘的可能,以及注意事项,如返回类型、精度、性能等。确保回答结构清晰,步骤明确,帮助用户理解不同的使用场景和选择。</think>在Java中,`Math`类提供了基础的数学运算方法,但没有直接命名为“平方”或“立方”的方法。以下是实现平方和立法的常见方式及注意事项: --- ### 一、平方的实现 1. **使用`Math.pow()`方法** 语法:`Math.pow(base, 2)` 示例: ```java double x = 5.0; double square = Math.pow(x, 2); // 返回25.0 ``` 2. **直接通过乘法运算** 更高效的方式: ```java double square = x * x; // 直接相乘(推荐) ``` --- ### 二、立方的实现 1. **使用`Math.pow()`方法** 语法:`Math.pow(base, 3)` 示例: ```java double x = 4.0; double cube = Math.pow(x, 3); // 返回64.0 ``` 2. **直接通过乘法运算** 更高效的方式: ```java double cube = x * x * x; // 直接相乘(推荐) ``` --- ### 三、关键注意事项 1. **返回值类型** `Math.pow()`始终返回`double`类型,即使输入是整数。 例如:`Math.pow(2, 3)`返回`8.0`而非`8`。 2. **精度问题** 对极大或极小值使用`Math.pow()`时可能出现浮点误差: ```java System.out.println(Math.pow(1e20, 2)); // 可能输出1.0E40(精度丢失) ``` 3. **性能对比** - `Math.pow()`需要函数调用和参数检查,效率略低。 - 直接相乘(如`x*x`或`x*x*x`)是更快的操作,**推荐在简单场景中使用**。 4. **特殊值处理** - 如果参数是`NaN`,返回`NaN`。 - 如果指数为`0`(如`Math.pow(x, 0)`),返回`1.0`。 - 负数立方示例: ```java Math.pow(-2, 3); // 返回-8.0 ``` --- ### 四、完整代码示例 ```java public class Main { public static void main(String[] args) { double num = 3.0; // 平方 double square1 = num * num; // 9.0 double square2 = Math.pow(num, 2); // 9.0 // 立方 double cube1 = num * num * num; // 27.0 double cube2 = Math.pow(num, 3); // 27.0 System.out.println("平方(乘法): " + square1); System.out.println("平方(Math.pow): " + square2); System.out.println("立方(乘法): " + cube1); System.out.println("立方(Math.pow): " + cube2); } } ``` --- ### 五、总结 - **简单场景**:优先使用直接乘法(`x*x`或`x*x*x`),效率更高。 - **动态指数**:若指数是变量(如`Math.pow(x, n)`),则必须使用`Math.pow()`。 - **代码可读性**:如果强调数学意义,`Math.pow()`更直观。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值