Java大数处理

以前整理过有关Java的基本知识,也写了几个有关java的题目,不过发现不够完善,现在重新整合一下。

1.Java的输入与输出

java的输入是先定义一个scanner,然后用这个进行输入,并且每一种输入都有相应的输入函数,具体如下:

复制代码
public class Main
{
    public static void main(String[] args)
    {
        Scanner cin = new Scanner ( System.in);
        int a;
        double b;
        BigInteger c;
        String st;
        a = cin.nextInt();
        b = cin.nextDouble();
        c = cin.nextBigInteger();
        d = cin.nextLine();
        // 每种类型都有相应的输入函数.
    }
}
复制代码

Java的输出相较于输入来说就简单一些了。

复制代码
System.out.println(a + " " + b);
System.out.printf("%d %10.5f\n", a, b);

/*规格化的输出:
函数:这里0指一位数字,#指除0以外的数字(如果是0,则不显示),四舍五入.*/
DecimalFormat fd = new DecimalFormat("#.00#");
DecimalFormat gd = new DecimalFormat("0.000");
System.out.println("x =" + fd.format(x));
System.out.println("x =" + gd.format(x));
复制代码

 

2.大数部分

java支持大数的操作,其中也是由具体函数实现的。看下面的例子:

复制代码
int a = 123, b = 456;
BigInteger x, y, z, ans;
x = BigInteger.valueOf(a);//转换
y = BigInteger.valueOf(b);
ans = x.add(y);
ans = x.divide(y);
ans = x.mod(y);
if (ans.compareTo(x) == 0)//比较
    System.out.println("相等");
复制代码

这里就写出了int型转换成大数型以及加减乘除比较的基本操作。其中函数原型如下:

BigInteger add(BigInteger other) 
BigInteger subtract(BigInteger other) 
BigInteger multiply(BigInteger other) 
BigInteger divide(BigInteger other) 
BigInteger mod(BigInteger other) 
int compareTo(BigInteger other) 
static BigInteger valueOf(long x) 

这是大整数的操作,其中还有一个数据类型为:BigDecimal,表示小数,操作与以上相同。

3.格式化输出:

以前做题遇到过这样的情况,如何去掉末尾的0,有一个具体的函数,stripTrailingZeros()函数就是用于去除末尾多余的0的,但是此时程序的输出为科学记数法例如: 1E+2。解决的方法很简单,如果想要避免输出科学计数法的字符串,我们要用toPlainString()函数代替toString()。如:System.out.println( new BigDecimal("100.000").stripTrailingZeros().toPlainString());此时程序的输出就为 100。具体实现:

        Scanner in=new Scanner (System.in);
        BigDecimal a,b;
        while(in.hasNext())
        {
            a=in.nextBigDecimal();
            b=in.nextBigDecimal();
            System.out.println(a.add(b).stripTrailingZeros().toPlainString());
        }

4.具体实例:

HDU - 1042:计算阶乘:

复制代码
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Main//注意在oj提交是要用Main
{
    public static void main(String[] args) 
    {
        Scanner in=new Scanner (System.in);
        int n;

        while(in.hasNext())
        {
            n=in.nextInt();
            BigInteger sum=BigInteger.valueOf(1);
            for(int i=1;i<=n;i++)
                sum=sum.multiply(BigInteger.valueOf(i));
            System.out.println(sum);
        }
    }
}
复制代码

POJ1001 计算a^b 注意是小数

复制代码
import java.io.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
public class Main//注意在oj提交是要用Main
{
    public static void main(String[] args) 
    {
        Scanner in=new Scanner (System.in);
        int n;
        BigDecimal a,b;
        while(in.hasNext())
        {
            b=BigDecimal.valueOf(1);
            a=in.nextBigDecimal();
            n=in.nextInt();
            for(int i=0;i<n;i++)
            {
                b=b.multiply(a);
            }
            String s = b.stripTrailingZeros().toPlainString();
            if(s.startsWith("0"))
                s=s.substring(1);
            System.out.println(s); 
        }
    }
}
复制代码

HDU - 1753  计算A+B 保留最简形式

复制代码
import java.io.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
public class Main//注意在oj提交是要用Main
{
    public static void main(String[] args) 
    {
        Scanner in=new Scanner (System.in);
        BigDecimal a,b;
        while(in.hasNext())
        {
            a=in.nextBigDecimal();
            b=in.nextBigDecimal();
            System.out.println(a.add(b).stripTrailingZeros().toPlainString());
        }
    }
}
复制代码

UVA 10007:计算卡特兰数

复制代码
import java.math.BigInteger;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        BigInteger []k = new BigInteger[1100];
        k[0] = BigInteger.valueOf(1);
        for(int j=1;j<310;j++)
        {
                k[j]=k[j-1].multiply(BigInteger.valueOf(4*j-2)).divide(BigInteger.valueOf(j+1));  
        }
        while (true)  
        {  
            int times=input.nextInt(); 
            BigInteger sum=BigInteger.valueOf(1);
            if(times!=0)  
                {
                    for(int i=1;i<=times;i++)
                        sum=sum.multiply(BigInteger.valueOf(i));
                    System.out.println(sum.multiply(k[times]));  
                }
            else 
            {  
                break;  
            }  
        }  
    }

}
复制代码

 

posted @   爱国呐  阅读(4111)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示