Java语言 两个大数相乘比如1234567890123×1234567890123  结果肯定任何类型都存不下 会溢出的 ,要怎么解决这个问题呢?
 有兄弟提示说用移位运算效率高能解决,期待解决的具体思路,及源码 ,谢谢啦

解决方案 »

  1.   

    JAVA的超大数用java.math.BigInteger,带小数的用java.math.Decimal
    不用自己写代码
      

  2.   

    JAVA的超大数用java.math.BigInteger,带小数的用java.math.Decimal
    不用自己写代码
      

  3.   

    同楼上
    ①超大数用java.math.BigIntegerimport java.math.BigInteger;public class BigIntegerSample {

    public static final BigInteger a = new BigInteger("1234567890123");
    public static final BigInteger b = new BigInteger("200000000000000000000"); public static void main(String[] args) {
    BigInteger result = a.multiply(b);
    System.out.println(result.toString());
    }
    }
    输出结果:123456789012300000000000000000000②带数的用java.math.Decimal import java.math.BigDecimal;;public class BigIntegerSample {

    public static final BigDecimal a = new BigDecimal("1234567890123.1");
    public static final BigDecimal b = new BigDecimal("200000000000000000000.2"); public static void main(String[] args) {
    BigDecimal result = a.multiply(b);
    System.out.println(result.toString());
    }
    }输出结果:246913578024620000000246913578024.62
      

  4.   

    呵呵,都被楼上的答完了.楼上的都正确.
    用java.math.BigInteger,java.math.Decimal 
      

  5.   


    本例仅供参考。
    思想是最好的,将每位数在数组中单独存放。// =============== Program Description ===============
    // 程序名称: array04.java
    // 程序目的: 设计一个可容纳40位数的求n!程序
    // ===================================================
    import ConsoleReader.*; // 导入已定义的数据输入类public class array04
    {
    public static void main(String args[])
    {

    int Data[] = new int[40]; // 储存40位数的整数数组
    int Digit; // 数据位数变量
    int i,j,r,k; // 回圈计数变量
    int N; // 用户输入值 for (i=1;i<40;i++) // 将数组初始值设为0
    Data[i] = 0; Data[0] = 1;               // 设数组第0位数为1
    Data[1] = 1; // 设数组第1位数为1
    Digit = 1; // 设数据位数为1 System.out.print("Enter a number what you want to calculus : ");
    ConsoleReader console = new ConsoleReader(System.in);
    // 读取用户欲求的N值
    N = console.readInt();

    for (i=1;i<N+1;i++)
    {
    for (j=1;j<Digit+1;j++)
    Data[j] *= i; // 数组中内容的运算
    for (j=1;j<Digit+1;j++)
    {
    if (Data[j]>10)
    {
    for (r=1;r<Digit+1;r++)
    {
    if (Data[Digit]>10)
    Digit++;
    // 当数组中的值大于10时,则位数加1
    Data[r+1] += Data[r]/10;
    // 前一位数组值 = 前一位数组值 + 此位数组值除以10
    Data[r]=Data[r]%10;
    // 此位数组值 = 此位数组值除10取余数
    }
    }
    }
    System.out.print(i+"! = ");
    for (k=Digit;k>0;k--) // 打印出数组中的内容
    System.out.print(Data[k]);
    System.out.println("");
    }
    }
    }
      

  6.   


    // =============== Program Description ===============
    // 程序名称: ConsoleReader.java
    // 程序目的: 本类用于数据的输入及转换。 
    // ===================================================
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.IOException;public class ConsoleReader
    {
    public ConsoleReader(InputStream inStream)
        {
        reader = new BufferedReader (new InputStreamReader(inStream)); 
        }
       
    public int readInt()  // 整数输入
        {  
        String inputString = readLine();
           int n = Integer.parseInt(inputString);
          
           return n;
        }
       
    public double readDouble()  // 浮点数输入
        {  
        String inputString = readLine();
           double x = Double.parseDouble(inputString);
          
           return x;
        } public String readLine()
        {  
        String inputLine = "";
       
           try
           {
           inputLine = reader.readLine();
           }
           catch(IOException e)
           {
           System.out.println(e);
              System.exit(1);
           }       return inputLine;
        }
       
        private BufferedReader reader; 
    }
      

  7.   

    当然是用BigInteger或BigDecimal之类的了,都是集成的工具类,很多方法可以用的