java大数题集

自己的代码提交的时候记得注释掉第一行的package!(真的很容易忘记)

hdu1002 A + B Problem II

题意:

大数a+b

code:

加法:
a.add(b)

import java.math.*;
import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		int T=cin.nextInt();
		for(int cas=1;cas<=T;cas++) {
			BigInteger a=cin.nextBigInteger();
			BigInteger b=cin.nextBigInteger();
			BigInteger c=a.add(b);
			System.out.println("Case "+cas+":");
			System.out.println(a+" + "+b+" = "+c);
			if(cas<T) {
				System.out.println();
			}
		}
	}
}

hdu6433 Problem H. Pow

题意:

其实就是计算2n(n<=1000)

code:

乘法:
a.multiply(b)

import java.math.*;
import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		int T=cin.nextInt();
		for(int i=1;i<=T;i++) {
			int n=cin.nextInt();
			BigInteger ans=BigInteger.valueOf(1);
			for(int j=1;j<=n;j++) {
				ans=ans.multiply(BigInteger.valueOf(2));
			}
			System.out.println(ans);
		}
	}
}

hdu1042 N!

题意:

求n! (n<=1e4)

code:

BigInteger.valueOf(x)可以把int类型的x变成大数

import java.math.*;
import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		while(cin.hasNextInt()) {
			int n=cin.nextInt();
			BigInteger ans=BigInteger.valueOf(1);
			for(int i=2;i<=n;i++) {
				ans=ans.multiply(BigInteger.valueOf(i));
			}
			System.out.println(ans);
		}
	}
}

hdu6225 Little Boxes

题意:

输入a,b,c,d,输出a+b+c+d
(每个数<=262)

code:

BigInteger.valueOf(x)可以把long类型的x转成大数
大数的0也可以用BigInteger.ZERO

import java.math.*;
import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		int T=cin.nextInt();
		while(T-->0) {
			BigInteger ans=BigInteger.valueOf(0);
			for(int i=0;i<4;i++) {
				long x=cin.nextLong();//别忘了是long不是int,不然白给wa
				ans=ans.add(BigInteger.valueOf(x));
			}
			System.out.println(ans);
		}
	}
}

hdu1047 Integer Inquiry

题意:

多个大数相加

code:

循环输入大数:
while(cin.hasnextBigInteger())
判断大数x是否为0:
x.compareTo(BigInteger.valueOf(0))==0

import java.math.*;
import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		int T=cin.nextInt();
		while(T-->0) {
			BigInteger ans=BigInteger.valueOf(0);
			while(cin.hasNextBigInteger()) {
				BigInteger x=cin.nextBigInteger();
				if(x.compareTo(BigInteger.valueOf(0))==0)break;
				ans=ans.add(x);
			}
			System.out.println(ans);
			if(T>0)System.out.println("");
		}
	}
}

hdu1715 大菲波数

题意:

求斐波那契第n项(n<=1000)

code:

大数数组的使用和其他类型基本一致
大数的1可以用BigInteger.ONE
还试了一下全局变量和函数

import java.math.*;
import java.util.*;
public class Main {
	public static BigInteger[] f=new BigInteger[1000+5];
	public static void init() {
		f[1]=f[2]=BigInteger.valueOf(1);
		for(int i=3;i<1000+5;i++) {
			f[i]=f[i-1].add(f[i-2]);
		}
	}
	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		init();
		int T=cin.nextInt();
		while(T-->0) {
			int n=cin.nextInt();
			System.out.println(f[n]);
		}
	}
}

hdu1316 How Many Fibs?

题意:

给a,b,问[a,b]有多少个数在斐波那契数列中(a,b<=10100)

思路:

上一题hdu1715 大菲波数,把那题代码改了一下,计算出f[1000]的位数已经超过了题目范围
所以直接暴力for循环找有多少个斐波那契数在范围内即可

判断f[1000]的位数:

求位数不断除10,用到了除法:
a.divide(b)

package Main;
import java.math.*;
import java.util.*;
public class Main {
	public static BigInteger[] f=new BigInteger[1000+5];
	public static void init() {
		f[1]=f[2]=BigInteger.valueOf(1);
		for(int i=3;i<1000+5;i++) {
			f[i]=f[i-1].add(f[i-2]);
		}
	}
	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		init();
		int cnt=0;
		BigInteger temp=f[1000];
		while(temp.compareTo(BigInteger.valueOf(0))>0) {
			cnt++;
			temp=temp.divide(BigInteger.valueOf(10));
		}
		System.out.println(cnt);
	}
}
code:

这题是f[1]=1,f[2]=2,上一题f[1]=f[2]=1,差点上当

import java.math.*;
import java.util.*;
public class Main {
	public static BigInteger[] f=new BigInteger[1000+5];
	public static void init() {
		f[1]=BigInteger.valueOf(1);
		f[2]=BigInteger.valueOf(2);
		for(int i=3;i<1000+5;i++) {
			f[i]=f[i-1].add(f[i-2]);
		}
	}
	public static int cal(BigInteger a,BigInteger b) {
		int ans=0;
		for(int i=1;i<1000+5;i++) {
			if(f[i].compareTo(a)>=0&&f[i].compareTo(b)<=0)ans++;
		}
		return ans;
	}
	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		init();
		BigInteger zero=BigInteger.valueOf(0);
		while(cin.hasNextBigInteger()) {
			BigInteger a=cin.nextBigInteger();
			BigInteger b=cin.nextBigInteger();
			if(a.compareTo(zero)==0&&b.compareTo(zero)==0)break;
			System.out.println(cal(a,b));
		}
	}
}

hdu1753 大明A+B

题意:

两个高精度小数相加

code:

BigDecimal 高精度小数
a.stripTrailingZeros() 去掉小数后面多余的0,例如把4.0变成4
a.toPlainString() 转化为普通计数法字符串,如果用toString()可能会输出1e-213123等科学计数法

import java.math.*;
import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		while(cin.hasNextBigDecimal()) {
			BigDecimal a=cin.nextBigDecimal();
			BigDecimal b=cin.nextBigDecimal();
			BigDecimal c=a.add(b);
			System.out.println(c.stripTrailingZeros().toPlainString());
		}
	}
}

hdu1063 Exponentiation

题意:

给小数r和整数n求rn,并处理输出格式
0.xxxx要输出.xxxx,即去掉前面的0
3.xxxx0要输出3.xxxx,即去掉后面的0

code:

a.stripTrailingZeros() 去掉小数后面多余的0
a.toPlainString() 转化为普通计数法字符串
A.startsWith(“B”)判断字符串A是否以B开头
A.substring(pos)A的从pos到末尾的字串

import java.math.*;
import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		while(cin.hasNext()) {
			double r=cin.nextDouble();
			int n=cin.nextInt();
			BigDecimal c=BigDecimal.valueOf(1);
			for(int i=1;i<=n;i++) {//也可以c=r.pow(n)
				c=c.multiply(BigDecimal.valueOf(r));
			}
			String ans=c.stripTrailingZeros().toPlainString();
			if(ans.startsWith("0")) {//去掉小数0.xxx前面的0
				ans=ans.substring(1);
			}
			System.out.println(ans);
		}
	}
}

牛客 进制转换

https://ac.nowcoder.com/acm/contest/3282/F

题意:

给一个a进制的串,要求转化为b进制
a,b<=36,串的长度<=200

思路:

先把输入的串按照a进制转化为10进制,然后10进制转化为b进制
过程中都用大数

这题用到的函数:
大数转为int:BigInteger.intvalue();
大数对x取余:BigInteger.remainder(x);
大数除以x:BigInteger.divide(x);
大数与另一个大数X比较:BigInteger.compareTo(X),大于返回正数,小于返回负数,等于返回0
字符串取pos位置的字符:String.charAt(pos)

code1:

自己写的,有点长,下面还挂了一份别人的代码。

//https://ac.nowcoder.com/acm/contest/3282/F
package Main;
import java.util.*;
import java.math.*;
public class Main {
	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		String temp=cin.nextLine();
		int len=temp.length();
		BigInteger now=BigInteger.valueOf(0),a,b,p=BigInteger.valueOf(1);
		a=cin.nextBigInteger();//a进制
		b=cin.nextBigInteger();
		for(int i=len-1;i>=0;i--,p=p.multiply(a)) {
			char t=temp.charAt(i);
			if(t>='0'&&t<='9') {//如果是数字
				int v=t-'0';
				now=now.add(p.multiply(BigInteger.valueOf(v)));
			}else {//如果是字符
				int v=t-'a'+10;
				now=now.add(p.multiply(BigInteger.valueOf(v)));
			}
		}
		//now是10进制
		//现在要转成b进制
		String ans="";
		BigInteger remain;
		while(now.compareTo(zero)>0) {
			remain=now.remainder(b);
			now=now.divide(b);
			char c;
			if(remain.compareTo(BigInteger.valueOf(9))>0) {//如果大于9则为字符
				c=(char)(remain.intValue()-10+'a');
			}else {//否则为数字
				c=(char)(remain.intValue()+'0');
			}
			ans+=c;
		}
		len=ans.length();
		for(int i=len-1;i>=0;i--) {
			System.out.print(ans.charAt(i));
		}
	}
}
code2:

别人的,利用了java自带的函数。

import java.math.BigInteger;
import java.util.*;
public class Main{
	public static void main(String args[]) {
		Scanner scan=new Scanner(System.in);
		String str=scan.next();
		int a=scan.nextInt();
		int b=scan.nextInt();
		//a进制数转为b进制数
		String res=new BigInteger(str,a).toString(b);
		System.out.println(res);
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值