首页 > 代码库 > 高精度运算 Java算法

高精度运算 Java算法

问题描述
   输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。
 算法描述
   由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
   定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。
   计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。
   最后将C输出即可。
 输入格式
  输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。
 输出格式
  输出一行,表示a + b的值。
 样例输入
  20100122201001221234567890
    2010012220100122
  样例输出

  20100122203011233454668012

 可以用Java的BigDecimal类,代码如下

import java.math.BigDecimal;  
import java.util.Scanner;  
  
public class Main {  
  
    private static BigDecimal a,b,c;  
    public static void main(String[] args) {  
        Scanner sc = new Scanner(System.in);  
        a = sc.nextBigDecimal();  
        b = sc.nextBigDecimal();  
        c = a.add(b);//加  
//        c = a.subtract(b);//减  
//        c = a.multiply(b);//乘  
//        c = a.divide(b);//除  
        System.out.println(c);  
    }  
  
}  

附:高精度阶乘 

方法一:从1开始,一直递增乘到n

import java.math.BigDecimal;    
import java.util.Scanner;    
public class Test {    
    public static BigDecimal factorial(int n){     
        BigDecimal result = new BigDecimal(1);    
        BigDecimal a;    
        for(int i = 2; i <= n; i++){    
            a = new BigDecimal(i);//将i转换为BigDecimal类型    
            result = result.multiply(a);//不用result*a,因为BigDecimal类型没有定义*操作   
        }    
        return result;    
    }    
        
    public static void main(String[] arguments){    
        Scanner sc = new Scanner(System.in);    
        int a = sc.nextInt();//读取控制台输入的整数    
        System.out.println(a + "!=" + factorial(a));    
    }    
    
}    

方法二:从n开始,一直递减乘到2

import java.math.BigDecimal;    
import java.util.Scanner;    
public class Main {    
    public static BigDecimal factorial(BigDecimal n){    
        BigDecimal bd1 = new BigDecimal(1);//BigDecimal类型的1    
        BigDecimal bd2 = new BigDecimal(2);//BigDecimal类型的2   
        BigDecimal result = bd1;//结果集,初值取1    
        while(n.compareTo(bd1) > 0){//参数大于1,进入循环    
            result = result.multiply(n.multiply(n.subtract(bd1)));//实现result*(n*(n-1))    
            n = n.subtract(bd2);//n-2后继续    
        }    
        return result;    
    }    
    public static void main(String[] arguments){    
        Scanner sc = new Scanner(System.in);    
        BigDecimal  n = sc.nextBigDecimal();    
            
        System.out.print(n + "!=" + factorial(n));    
    }    
    
}    

方法三:用递归实现:f(n)=n*f(n-1),f(1)=1,递归相乘

import java.util.Scanner;    
import java.math.BigDecimal;    
public class Factorial {    
    public static BigDecimal factorial(BigDecimal n){    
        BigDecimal bd1 = new BigDecimal(1);//1    
        if(n.equals(new BigDecimal(1))){    
            return bd1;    
        }    
        else    
            return n.multiply(factorial(n.subtract(bd1)));//n*f(n-1)    
    }    
    public static void main(String[] arguments){    
        Scanner sc = new Scanner(System.in);    
        BigDecimal a = sc.nextBigDecimal();    
        BigDecimal result = factorial(a);       
        System.out.println(a + "!=" +result);    
            
    }    
    
}    

  

 

  

高精度运算 Java算法