Java 实现大数算法

在ACM竞赛里难免会遇到一些大数(即超大数字!)的问题,但是对于ACMers来说,彼时还没有学过java,只会敲一手C/C++(比如我的大一),这篇博客就简单讲一下用java来实现大数的相关操作

关于eclipse的使用,这里也捎带一提。

配置了jdk并安装好eclipse之后(什么?怎么配置jdk?当然要点这里了!(ubuntu系统))

进入到eclipse界面

第一步:file->new->java project->起名->finish

第二步:进入到刚才建的工程里,右键src->new->package->起名->finish

第三步:进入到刚才建的package里,右键name->new->class->起名(这里起名要注意,因为比赛时如果交java代码,这里的类名就要命名为Main,区分大小写
 

下面就开始写我们的代码了

先从最简单的来说:

1.输出hello world

package BigInteger;
public class Main {
    public static void main(String args[]) {
        System.out.println("Hello world");
    }
}

关于上面的package BigInteger,提交代码时不需要粘贴。

2.计算a+b

package BigInteger;
import java.util.*;//导包,相当于c/c++里的头文件
public class Main {
    public static void main(String args[]) {

        Scanner cin = new Scanner(System.in);

        int a,b;
        a = cin.nextInt();
        b=cin.nextInt();
        int ans = a + b;
        System.out.println(ans);
    }
}

3.多组输入 a b

package BigInteger;
import java.util.*;
public class Main {
    public static void main(String args[]) {

        Scanner cin = new Scanner(System.in);

        int a,b;
        while(cin.hasNext()) {
            a=cin.nextInt();
            b=cin.nextInt();
            int ans=a+b;
            System.out.println(ans);
        }
    }
}

下面就开始说大数的相关操作

首先我们需要导包,即BigIntegr类 和 BigDecimal类所在的包

import java,math.*;

*就代表导入包math里面所有的类,如果你不喜欢看到 *

那么你也可以写 import java,math.BigInteger; import java,math.BigDecimal;

1.大整数的加减乘除求余计算

/*
大数的加减运算不同于普通整数的加减乘除运算
加—— a+b: a=a.add(b);
减—— a-b: a=a.subtract(b); 
乘—— a*b: a=a.multiply(b);
除—— a/b: a=a.divide(b);
求余—a%b: a=a.mod(b);

System.out.println("a + b = "+ans_add); // 这里的‘+’ (第二个) 是连接的意思
*/

package BigInteger;
import java.util.*;
import java.math.*;
public class Main {
    public static void main(String args[]) {

        Scanner cin = new Scanner(System.in);

        BigInteger a , b;
        a=cin.nextBigInteger();
        b=cin.nextBigInteger();

        BigInteger ans_add,ans_sub,ans_mul,ans_div,ans_mod;

        ans_add = a.add(b); //a+b
        ans_sub = a.subtract(b); //a-b
        ans_mul = a.multiply(b); //a*b
        ans_div = a.divide(b); //a/b
        ans_mod = a.mod(b); //a%b
        System.out.println("a + b = "+ans_add);
        System.out.println("a - b = "+ans_sub);
        System.out.println("a * b = "+ans_mul);
        System.out.println("a / b = "+ans_div);
        System.out.println("a % b = "+ans_mod);

    }
}

运行结果如下:

下面举个求阶乘的例子:

package BigInteger;
import java.util.*;
import java.math.*;
public class Main {

    public static BigInteger factorial(BigInteger n){  
            BigInteger bd1 = new BigInteger("1");
            BigInteger bd2 = new BigInteger("2");
            BigInteger result = bd1;
            while(n.compareTo(bd1) > 0){
                    result = result.multiply(n);  
                    n = n.subtract(bd1); 
            }   
            return result;   
        }  

    public static void main(String args[]) {

        Scanner cin = new Scanner(System.in);

        BigInteger n;
        n=cin.nextBigInteger();

        BigInteger ans;
        ans = factorial(n);
        System.out.println("n的阶乘为: "+ans);

    }
}

关于BigDecimal的用法大致上和BigInteger一样。

不过这里需要提一下,在进行大浮点数运算的时候,小数点后面可能会含有多余的后导0

比如0.5000,在题目要求中可能只需要输出0.5

当然,有的题目可能还会要求小数点前面的0也要去掉,输入.5

这时候我们就需要去除掉后导0

转化成 字符型的

方法如下:

String str;
str=ans.stripTrailingZeros().toPlainString();
//去除所有后导0,并且转化成字符型
//ans为大浮点数运算后得到的答案
//如果小数点前面的0也需要去掉,那么输出的时候处理一下即可:
if(str.charAt(0)=='0')
        System.out.println(str.substring(1));
else
        System.out.println(str);

具体题目见这里!

猜你喜欢

转载自blog.csdn.net/jkdd123456/article/details/81170133