高精度运算 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);    

    }    

}

  

 

  

时间: 2024-11-18 01:34:16

高精度运算 Java算法的相关文章

高精度运算——java

java大法 java的框架. import java.io.*; import java.util.*; import java.math.*; public class Main{ public static void main(String []args){ Scanner cin=new Scanner(System.in); } } import的作用:简单的说就是导入,java有很多方法你可以直接使用,但是被封装在各个包(类)里面,你需要先导包,才能使用这个包里的方法. *的作用:表

hdu4927 Series 1(组合+公式 Java大数高精度运算)

题目链接: Series 1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 423    Accepted Submission(s): 146 Problem Description Let A be an integral series {A1, A2, . . . , An}. The zero-order series o

算法学习笔记(三)问题的转化与高精度运算

问题:设购票点没有任何的零钱,票价50美元,现有m人手持50美元,n人手持100美元,求这样m+n个人构成的队伍有多少种排队方法可以使得整个售票过程不中断. 分析:对于这个问题,经过简单的模拟可以发现,每个手持100的前面必须有一个手持50的,同样如果有k个手持100的连续出现,则前面至少连续k次50. 这样一来,可以设手持50元的为+1,手持100元的为-1,设ai为为第i个人所对应的值,则问题转化为数组的部分和a1+a2+...+ak≥0,其中k≤m+n,为了求这样的数列的个数,需要使用组合

整数高精度运算——加法

高精度运算是信息学的一种重要算法.这种算法使用多个存储单位进行计算,因此它的计算范围超过一般使用一个存储单位的算法.也是一些信息学竞赛的常考题目. 高精度运算主要有以下几个步骤: 1.读取字符串,转换成数字倒序存储到整数数组中: 2.运算,注意进位和借位: 3.倒序输出整数数组,加法注意最高位进位,减法注意高位中的无用的0不要输出: 高精度加法代码: #include<stdio.h>#include<string.h>char s[1000];       //数组比较大时,应作

关于大整数的加减乘除求余运算 java

自己用java 实现了大字符串整数的加减乘除和求余运算, 加减法的算法是模拟手工笔算的计算过程, 除法就是从最高位不停的减操作, 乘法的算法 :遍历一个数的各个位数以及他所在位置,另一个数根据这个数的位置末位添n个0,然后累加次数为这个位置数的数值 原创代码如下: public class Demo6 { public static void main(String[]args){ System.out.println(add("-989","989")); Sys

一个开源的高精度运算库-GMP

https://gmplib.org/ 全称是GNU Multiple Precision Arithmetic Library,即GNU高精度算术运算库,官方网站是:http://gmplib.org/ 它的功能非常强大,接口很简单,文档详尽,有C风格的接口也有C++的精心封装后的接口,其中不但有普通的整数.实数.浮点数的高精度运算,还有随机数生成,尤其是提供了非常完备的数论中的运算接口,比如Miller-Rabin素数测试算法,大素数生成,欧几里德算法,求域中元素的逆,Jacobi符号,le

7-10 高精度运算(20 分

7-10 高精度运算(20 分)提问 分别给出N和A的值(都是整数,1<=N<=150, 0<=A<=15).请给出级数∑?i=1?N??i?A?i??的答案. 输入格式: 有多组测试数据,每组测试数据占一行,该行包含2个整数N和A,以空格分隔. 输出格式: 对于输入每一行,在一行中输出相应于N和A的总和的整数值. 输入样例: 3 3 4 4 输出样例: 102 1252 import java.math.BigInteger; import java.util.Scanner;

Java算法与数据结构

Java算法与数据结构学习 一.数组 //声明数组 dataType[] arrayRefVar; //创建数组 arrayRefVar = new dataType[arraySize]; dataType[] arrayRefVar = new dataType[arraySize]; dataType[] arrayRefVar = {value0, value1, ..., valuek}; 1.使用自定义类封装数组 public class MyArray{ private long

高精度运算

在开发中高精度运算使用并非非常频繁,float和double的精度实际上能够满足绝大多数需要,且高精度运算效率比常规的运算要慢一点,但使用高精度运算往往是为了使用其中便捷的API.官方提供的高精度运算的类主要两个 BigInteger:当数值范围超过long时使用 BigDecimal:几乎涵盖BigInteger功能,还可以保留小数点任意位数,理论上精度无穷大,以下主要说明此类 注:两者API很相似 加减乘除 BigDecimal aaa = new BigDecimal(20); BigDe