高精度运算

来源:互联网 发布:dll修复软件 编辑:程序博客网 时间:2024/04/30 00:20
问题描述
   输入两个整数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);                }    }  





0 0