java 大数

转自 : https://blog.csdn.net/lrita/article/details/51428426
利用Java大数的ACM题:HDU 1715 1002 1042 1753 1865 1063,代码Accepted。
代码比较简单,题目详细描述见官网 http://acm.hdu.edu.cn/listproblem.php?vol=1

[java] view plain copy

//1715 求斐波那契数列
import java.math.*;
import java.util.*;

public class Main
{
public static void main(String args[]){

 BigDecimal a[] = new BigDecimal[1005];  
 Scanner cin = new Scanner(System.in);  
 while(cin.hasNext()){//等价于!=EOF  

       a[1] = a[2] = new BigDecimal("1");  
       for (int i =3; i< 1005; i++){  
           a[i] = a[i-1].add(a[i-2]);  
       }  
       int N = cin.nextInt();  
       for (int j = 0; j< N;j++){  
           int pi = cin.nextInt();   
           System.out.println(a[pi]);  
       }  
     }    
 }  

//1753 求A+B
import java.math.*;
import java.util.*;

public class Main
{
public static void main(String args[]){

 BigDecimal c = new BigDecimal("0");    
 Scanner cin = new Scanner(System.in);  
 while(cin.hasNext()){//等价于!=EOF  
       BigDecimal a = cin.nextBigDecimal();    
       BigDecimal b = cin.nextBigDecimal();    
       c = a.add(b);  
       System.out.println(c.stripTrailingZeros().toPlainString());  
     }    
 }  

}

//1002 求 A+B(注意格式)
import java.math.*;
import java.util.*;

public class Main
{
public static void main(String args[]){

 BigInteger c = new BigInteger("0");    
 Scanner cin = new Scanner(System.in);  
 int N = cin.nextInt();  
 //while(cin.hasNext()){//等价于!=EOF  

 for (int i = 1;i<=N;i++){  
        BigInteger a = cin.nextBigInteger();    
        BigInteger b = cin.nextBigInteger();    
        c = a.add(b);  
        System.out.println("Case "+i + ":");  
        System.out.println(a + " + " + b + " = " + c);  
        if( i != N)      
            System.out.println();//注意:最后一个样例后不输出空行  
        }  
     }    
// }    

}

//1042 求阶乘
import java.math.*;
import java.util.*;

public class Main
{
public static void main(String args[]){

 Scanner cin = new Scanner(System.in);  
 while (cin.hasNext()){  
    // 计算阶乘  
     BigInteger c = new BigInteger("1");    
     int n = cin.nextInt();  
     for(int i = 1;i <= n; i++){  
         BigInteger s = BigInteger.valueOf(i);  
         c = c.multiply(s);  
     }  
     System.out.println(c);  
 }  
}  

}

//1685 求111的组合个数:类似于一个有n级的楼梯,一次可以上一个台阶,也可以上两个台阶,问一共有多少种方法。
import java.math.*;
import java.util.*;

public class Main
{
public static void main(String args[]){

 BigInteger arr[] = new BigInteger[205];    
 Scanner cin = new Scanner(System.in);  
 arr[1] = BigInteger.valueOf(1);  
 arr[2] = BigInteger.valueOf(2);  
 for (int j = 3; j<205; j++){  
     arr[j] = arr[j-1].add(arr[j-2]);  
 }  
 int N = cin.nextInt();    
 for (int i = 0;i<N; i++){  
     BigInteger a = cin.nextBigInteger();    
     int k = a.toString().length();  

     System.out.println(arr[k]);  

 }  
}  

}

//1063 求R的n次方,注意输出格式的要求
import java.math.*;
import java.util.*;

public class Main
{
public static void main(String args[]){

 Scanner cin = new Scanner(System.in);  
 while (cin.hasNext()){  
    // 计算n方  
     BigDecimal r = cin.nextBigDecimal();  
     int n = cin.nextInt();  
     BigDecimal rn = new BigDecimal("1.0");   
     rn = r.pow(n).stripTrailingZeros();//去掉字符串最后面的0以及来消除BigDecimal用科学计数形式来表示结果  
     String tmp = rn.toPlainString();  
     //去掉前导0  
     if(tmp.startsWith("0"))  
         tmp=tmp.substring(1);  

      System.out.println(tmp);    
 }  
}  

}

第二篇:https://blog.csdn.net/stffer/article/details/46382949
对于经常用c及c++编程进行acm竞赛的弱菜来说,写一道f大数题,是比较麻烦的,然而这对于用java来写来写,却是小菜一碟,
于是我就在网上找了并整理一下java对于大数方面的应用,虽然这对于java强手来说,是有点大材小用的feel ,不过对于我们来说,这却是福音,hahaha……

1.首先,需要的头文件:

[java] view plain copy

import java.math.*; // 包含大数类的包

import java.util.*; // 包含输入头的包

2.然后一个java程序的主体应该是这样:
[java] view plain copy

public class Main{
public static void main(String args[]){
Scanner cin = newScanner(System.in); // 输入必备句
}
}

3.与c/c++进行对比:
while(n–>0) // 等价 while(n–) n减到0

EOF:用法
普通的数: while(cin.hasNextInt()) //等同于!=EOF,第一数一定要输入整形的
大数的一般是:while(cin.hasNextBigInteger()) //第一个数一定要输入大数
System.out.print(m.toString()); // m.toString() 将m转为String 类

System.out.print(n); // 输出n
System.out.println(n);// 输出n并换行

System.out.println(“Case#”+(t++)+”:”+” “+c.toString(2)); //t为int c为大数 输出时字符与字符之间用+隔开 字符与字符之间有数据 在数据两边都加上+
换行符 System.out.print(“\n”);或 System.out.println();
输出空格 System.out.print(” “);

4.下面集合了很多大数的用法:
运算类:

[java] view plain copy

//d为int型,a,b,c都为大数
c=a.add(b); // 相加
c=a.subtract(b); // 相减
c=a.multiply(b); // 相乘
c=a.divide(b); // 相除取整
c=a.gcd(b); // 最大公约数
c=a.remainder(b); // 取余
c=a.mod(b); // a mod b
c=a.abs(); // a的绝对值
c=a.negate(); // a的相反数
c=a.pow(d); // a的b次幂 d为int型
c=a.max(b); // 取a,b中较大的
c=a.min(b); // 取a,b中较小的
d=a.compareTo(b); // 比较a与b的大小 d=-1小于 d=0等于 d=1大于 d为int型
a.equals(b); // 判断a与b是否相等 相等返回true 不相等返回false

5.类型转换类:

[java] view plain copy

d=a.intValue(); // 将大数a转换为 int 类型赋值给 d
e=a.longValue(); // 将大数a转换为 long 类型赋值给 e
f=a.floatValue(); // 将大数a转换为 float 类型赋值给 f
g=a.doubleValue(); // 将大数a转换为 double 类型赋值给 g
s=a.toString(); // 将大数a转换为 String 类型赋值给 s
s=a.toPlainString(); //将大数a转换为String类型赋值给s,且不表示为科学计数法
a=BigInteger.valueOf(e); // 将 e 以大数形式赋值给大数 a e只能为long或int
a=newBigInteger(s, d); // 将s数字字符串以d进制赋值给大数a如果d=s字符数字的进制则等同于将数字字符串以大数形式赋值给大数a

6.进制转换类

[java] view plain copy

String st = Integer.toString(num, base); //把int型num当10进制的数转成base进制数存入st中 (base <= 35).
int num = Integer.parseInt(st, base); //把st当做base进制,转成10进制的int
(parseInt有两个参数,第一个为要转的字符串,第二个为说明是什么进制).
BigInter m = new BigInteger(st, base); // st是字符串,base是st的进制.
BigInteger a;
int b;
Stringc;
a=cin.nextBigInteger(b); //以b进制读入一个大数赋值给a
c=a.toString(b); // 将大数a以b进制的方式赋给字符串c
a=newBigInteger(c, b); //把c 当做“b进制“转为十进制大数赋值给a

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值