两个大数相乘、相加,使用字符串计算。(搬砖)

代码:

依赖:

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.4</version>
</dependency>

 

import org.apache.commons.lang3.StringUtils;

/**
 * @description:
 * @create: 2019/04/29 13:53
 */
public class SpringOperation {

    /**
     * 两个大数相乘
     *
     * @param num1
     * @param num2
     * @return
     */
    public static String multiply(String num1, String num2) {
        //把字符串转成char数组
        char chars1[] = num1.toCharArray();
        char chars2[] = num2.toCharArray();
        //声明存放结果和两个乘积的容器
        int result[] = new int[chars1.length + chars2.length];
        int n1[] = new int[chars1.length];
        int n2[] = new int[chars2.length];
        //把char转换成int数组。
        for (int i = 0; i < chars1.length; i++) {
            n1[i] = chars1[i] - '0';
        }
        for (int j = 0; j < chars2.length; j++) {
            n2[j] = chars2[j] - '0';
        }
        //逐个相乘
        for (int i = 0; i < chars1.length; i++) {
            for (int j = 0; j < chars2.length; j++) {
                result[i + j] += n1[i] * n2[j];
            }
        }
        //从后往前满十进位
        for (int i = result.length - 1; i > 0; i--) {
            result[i - 1] += result[i] / 10;
            result[i] = result[i] % 10;
        }
        //转成string并返回
        String resultStr = "";
        for (int i = 0; i < result.length - 1; i++) {
            resultStr += "" + result[i];
        }
        return resultStr;
    }

    /**
     * 用字符串模拟两个大数相加
     * <a href="http://home.cnblogs.com/u/309701/" target="_blank">@param</a> n1 加数1
     * <a href="http://home.cnblogs.com/u/309701/" target="_blank">@param</a> n2 加数2
     * <a href="http://home.cnblogs.com/u/69429/" target="_blank">@return</a>   相加结果
     */
    public static String bigNumberPlus(String a, String b) {
        int lenA = a.length();
        int lenB = b.length();
        if (lenA > lenB) {
            b = StringUtils.leftPad(b, lenA, "0");
        } else {
            a = StringUtils.leftPad(a, lenB, "0");
        }

        int[] arrC = new int[a.length() + 1];

        for (int i = a.length() - 1; i >= 0; i--) {
            int ai = Integer.parseInt(a.charAt(i) + "");
            int bi = Integer.parseInt(b.charAt(i) + "");
            int ci = arrC[i + 1];
            int t = ai + bi + ci;
            arrC[i + 1] = t % 10;
            arrC[i] = t / 10;
        }

        StringBuffer res = new StringBuffer();
        for (int i = 0; i < arrC.length; i++) {
            if (i == 0 && arrC[i] == 0) continue;
            res.append(arrC[i]);
        }
        return res.toString();
    }

    public static void main(String[] args) {
        System.out.println("乘法3*4="+multiply("3","4"));
        System.out.println("加法3+4="+bigNumberPlus("3","4"));
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
以下是使用分治法实现大数相乘的C语言代码: ```c #include <stdio.h> #include <string.h> #define MAX_DIGIT 10000 // 最大位数 // 大数结构体 typedef struct { int len; // 位数 int digit[MAX_DIGIT]; // 数字 } BigInt; // 初始化大数 void initBigInt(BigInt *num) { num->len = 1; memset(num->digit, 0, sizeof(num->digit)); } // 从字符串中读取大数 void readBigInt(BigInt *num, char *str) { initBigInt(num); int len = strlen(str); int k = 0; for (int i = len - 1; i >= 0; i--) { num->digit[k++] = str[i] - '0'; } num->len = k; } // 输出大数 void printBigInt(BigInt *num) { for (int i = num->len - 1; i >= 0; i--) { printf("%d", num->digit[i]); } printf("\n"); } // 大数相加 BigInt addBigInt(BigInt *a, BigInt *b) { BigInt c; initBigInt(&c); int carry = 0; int i; for (i = 0; i < a->len || i < b->len; i++) { int digit = a->digit[i] + b->digit[i] + carry; c.digit[c.len++] = digit % 10; carry = digit / 10; } if (carry != 0) { c.digit[c.len++] = carry; } return c; } // 大数相减 BigInt subBigInt(BigInt *a, BigInt *b) { BigInt c; initBigInt(&c); int borrow = 0; int i; for (i = 0; i < a->len || i < b->len; i++) { int digit = a->digit[i] - b->digit[i] - borrow; if (digit < 0) { digit += 10; borrow = 1; } else { borrow = 0; } c.digit[c.len++] = digit; } while (c.len > 1 && c.digit[c.len - 1] == 0) { c.len--; } return c; } // 大数相乘 BigInt mulBigInt(BigInt *a, BigInt *b) { if (a->len == 0 || b->len == 0) { BigInt c; initBigInt(&c); return c; } if (a->len == 1 && a->digit[0] == 0) { BigInt c; initBigInt(&c); return c; } if (b->len == 1 && b->digit[0] == 0) { BigInt c; initBigInt(&c); return c; } if (a->len == 1 && b->len == 1) { BigInt c; initBigInt(&c); int digit = a->digit[0] * b->digit[0]; c.digit[0] = digit % 10; c.digit[1] = digit / 10; if (c.digit[1] > 0) { c.len = 2; } else { c.len = 1; } return c; } int n = a->len > b->len ? a->len : b->len; if (n % 2 != 0) { n++; } BigInt a1, a2, b1, b2; initBigInt(&a1); initBigInt(&a2); initBigInt(&b1); initBigInt(&b2); int i; for (i = 0; i < n / 2; i++) { if (i < a->len) { a1.digit[i] = a->digit[i]; a2.digit[i] = a->digit[i + n / 2]; } else { a1.digit[i] = 0; a2.digit[i] = 0; } if (i < b->len) { b1.digit[i] = b->digit[i]; b2.digit[i] = b->digit[i + n / 2]; } else { b1.digit[i] = 0; b2.digit[i] = 0; } } a1.len = n / 2; a2.len = n - n / 2; b1.len = n / 2; b2.len = n - n / 2; BigInt p1 = mulBigInt(&a1, &b1); BigInt p2 = mulBigInt(&a2, &b2); BigInt a3 = addBigInt(&a1, &a2); BigInt b3 = addBigInt(&b1, &b2); BigInt p3 = mulBigInt(&a3, &b3); BigInt tmp1 = subBigInt(&p3, &p1); BigInt tmp2 = subBigInt(&tmp1, &p2); BigInt c = addBigInt(&p1, &tmp2); return c; } int main() { char str1[MAX_DIGIT], str2[MAX_DIGIT]; printf("请输入两个大数:\n"); scanf("%s %s", str1, str2); BigInt a, b, c; readBigInt(&a, str1); readBigInt(&b, str2); c = mulBigInt(&a, &b); printf("结果为:\n"); printBigInt(&c); return 0; } ``` 使用示例: ``` 请输入两个大数: 12345678901234567890 98765432109876543210 结果为: 1219326311370217953791628064374301870 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值