`
IThead
  • 浏览: 428195 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

大整数相乘

    博客分类:
  • Java
阅读更多
一、乘数和被乘数为long类型的
public class BigNumberChengLong {

    public static void main(String[] args) {
        long p1 = 1234567890;
        long p2 = 1234567890;
        int result[] = new int[18];//保存结果
        for(int i:result){
            result[i] = 0;
        }

        int pi1[] = new int [getLength(p1)];
        int pi2[] = new int [getLength(p2)];
        //将乘数和被乘数存入数组中
        long temp = p1;
        int num = 0;
        int i = 0;
        while (temp > 0){
            num = (int) (temp%10);
            pi1[i] = num;
            i ++;
            temp /= 10;
        }
        temp = p2;
        i = 0;
        while (temp > 0){
            num = (int) (temp%10);
            pi2[i] = num;
            i ++;
            temp /= 10;
        }

        //计算
        temp = 0; //临时结果
        int step = 0;//进位
        int time = 0;//次数
        int bit = 0;//位数
        for(int j:pi1){
            time = bit;
            for(int k:pi2){
                temp = j * k;
                temp = temp + result[time];
                if(temp > 9){
                    int m = 0;//进位的次数
                    do{
                        result[time + m] = (int) (temp%10);
                        step = (int) ((temp - temp%10)/10);
                        m ++;
                        temp = result[time + m] + step;
                    }while (temp > 9);
                }else {
                    result[time] = (int) temp;
                }
                time ++;
            }
            bit ++;
        }
        System.out.println("***************************************");
        int length = result.length - 1;
        while(result[length] == 0){
            length --;
        }
        for(int j = length; j >= 0; j --){
            if(result[length] == 0){

            }
            System.out.print(result[j]);
        }
        System.out.println();
        System.out.println("***************************************");
    }

    //获得long类型的长度
    private static int getLength(long temp){
        int i = 0;
        while (temp > 0){
            temp = temp/10;
            i ++;
        }
        return i;
    }

}

二、乘数和被乘数是String类型的
public class BigNumberChengString {

    public static void main(String[] args){
        String p1 = "123456789012345678901234123456789012345678901234";//"123456789012345678901234";
        String p2 = "987654321098765432109876543210987654123456789012345678901234";//"987654321098765432109876543210987654";
        int ASCII = 48;
        char[] result = new char[p1.length() + p2.length()];
        for (int i = 0; i < result.length; i++) {
            result[i] = '0';
        }
        char ctemp = ' ';
        char[] pc1 = p1.toCharArray();
        for (int i = 0; i < pc1.length / 2; i++) {
            ctemp = pc1[i];
            pc1[i] = pc1[pc1.length - 1 - i];
            pc1[pc1.length - 1 - i] = ctemp;
        }
        char[] pc2 = p2.toCharArray();
        for (int i = 0; i < pc2.length / 2; i++) {
            ctemp = pc2[i];
            pc2[i] = pc2[pc2.length - 1 - i];
            pc2[pc2.length - 1 - i] = ctemp;
        }
        int temp = 0;//临时结果
        int step = 0;//进位
        int time = 0;//次数
        int bit = 0;//位数
        for (char c1 : pc1) {
            time = bit;
            for (char c2 : pc2) {
                temp = (c1 - ASCII) * (c2 - ASCII);
                temp = temp + result[time] - ASCII;
                if (temp > 9) {//进位
                    int i = 0;
                    do {
                        result[time + i] = (char) (temp % 10 + ASCII);
                        step = (temp - temp % 10) / 10;
                        i++;
                        temp = result[time + i] - ASCII + step;
                    } while (temp > 9);
                    result[time + i] = (char) (temp + ASCII);
                } else {
                    result[time] = (char) (temp + ASCII);
                }
                time++;
            }
            bit++;
        }
        System.out.println("##############################");
        System.out.print(p1 + " x " + p2 + " = ");
        for (int i = result.length - 1; i >= 0; i--) {
            System.out.print(result[i]);
        }
        System.out.println();
        System.out.println("##############################");
    }
}

分享到:
评论

相关推荐

    分治法求两个大整数相乘

    ### 分治法求两个大整数相乘 #### 一、问题背景及描述 在计算机科学领域,处理大整数的运算是一项常见的需求,尤其是在密码学、数据加密以及某些科学计算场景中。对于传统整数类型(如 `int`, `long` 等)无法表示...

    大整数相乘(C++实现),理论上整数位数任意

    在计算机科学中,大整数相乘是一个常见但复杂的问题,特别是在处理金融计算、加密算法或数学模拟等场景。C++作为一种强大的编程语言,提供了多种方法来处理这种问题。本项目实现了大整数相乘的功能,能够处理理论上...

    超大整数相乘算法的VB实现源代码

    本篇文章将深入探讨如何在VB中实现超大整数相乘算法,并提供相关源代码分析。 首先,我们需要了解超大整数的基本概念。在标准的数据类型如Integer或Long中,VB通常只能处理一定范围内的整数。超出这个范围,我们就...

    大整数相乘问题--分而治之

    在这个大整数相乘的问题中,我们就是用这种策略来高效地完成乘法运算。 一、基础理论 1. 大整数:大整数是指超过普通整型数据所能表示范围的整数,通常通过数组或链表等数据结构存储。 2. 分而治之:分而治之是算法...

    分治 大整数相乘

    这个思想在很多计算问题中都有应用,包括大整数相乘。 大整数相乘是计算机科学中一个典型的问题,特别是在处理金融、密码学或者数学计算时,可能需要处理超出普通整型变量范围的大数。在传统的算术运算中,我们通常...

    两个大整数相乘的C语言源代码

    是算法分析中的一个实验 用数组实现 用二重循环控制按位交叉相乘

    自已写的大整数相乘C++代码

    自己写的大整数相乘算法,算法里包含有大整数相加算法。

    大整数相乘vector容器

    标题提到的"大整数相乘vector容器"是一种利用C++中的`std::vector`来存储和操作大整数的方法。`std::vector`是C++标准库提供的一种动态数组,它可以灵活地调整大小,比固定大小的数组更加便捷,尤其适用于处理不确定...

    JAVA版大整数相乘

    java写的大整数乘法 可以计算很大的整数

    大整数相乘算法 分治法

    大整数相乘算法是计算机科学中用于处理超出标准数据类型范围的大整数乘法问题的一种方法。在大多数编程语言中,如C++,整数类型(如`unsigned long`)都有其最大值限制,一旦超过这个限制,就无法正确表示大整数的...

    分治法-大整数相乘.docx

    在大整数相乘的问题中,两个整数A和B分别有n位和m位,常规方法是逐位相乘并累加,但这种方法的时间复杂度过高。分治法通过将大问题划分为小问题来降低复杂度。 **分**的过程是将大整数A和B分别划分为两部分,例如A...

    两个10位以上大整数相乘 算法 设计

    本篇讨论的是一种基于字符数组和整型数组的大整数相乘算法,主要步骤如下: 1. **输入接收**:首先,使用字符数组接收用户输入的两个大整数,这是因为C++的标准输入流`cin`无法直接处理超过`int`类型的整数。字符...

    JAVA实现大整数相乘

    对于大整数相乘,我们可以直接调用`BigInteger`的`multiply()`方法。例如: ```java BigInteger num1 = new BigInteger("12345678901234567890"); BigInteger num2 = new BigInteger("98765432109876543210"); ...

    Win32下无符号大整数相乘优化算法及其C++实现

    在Win32环境下,处理无符号大整数相乘的问题主要涉及到大整数运算和算法优化。由于32位系统不直接支持超过128位的整数运算,因此需要自定义算法来实现。本文主要介绍了两种优化算法,并提供了一个简单的C++实现。 ...

    任意大整数相乘程序(c++实现)

    本项目“任意大整数相乘程序”就是基于这种需求而设计的,采用C++语言编写,通过链表结构来存储和操作大整数。 首先,我们要理解链表作为数据结构的优势。链表不依赖于数组的连续内存空间,因此可以灵活地存储任意...

    大整数相乘C++源码

    用递归分治的方法实现大整数相乘,解决了超出计算机表达范围的整数相乘问题,为了减小文件大小仅上传.cpp文件

    大整数相乘与相加的代码

    大整数相乘的实现则更为复杂,通常采用Karatsuba算法或更高效的Toom-Cook多项式分解算法。以Karatsuba算法为例: 1. **基线情况**:当大整数足够小时,可以直接转换为整型并使用内置乘法运算符`*`。 2. **分解**:...

    利用 竖式实现 大整数相乘

    大整数相乘,仅作参考。利用竖式的。不是分治算法的喔。

    100位以内的大整数相乘的实现

    本程序实现两个100位以内的大整数相乘的算法。 大家可以借鉴一下,如果可以再改进一下就更好了。

    两个n位大整数相乘算法.pdf

    【两个n位大整数相乘算法】 在计算机科学中,处理大整数乘法是一项基本操作,特别是在加密、计算几何、数值分析等领域。当涉及的整数位数较大时,传统的乘法算法(如竖式乘法)的效率会变得低下。为了解决这个问题...

Global site tag (gtag.js) - Google Analytics