自己的代码提交的时候记得注释掉第一行的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);
}
}