引入大数类所在的包:
import java.math.*;
一.题单
不会的话可以翻到下面的题解
①HDU-1002:输出A+B(整数)
②HDU-1753:输出A+B(浮点数,去掉多余的0)
③HDU-2054:判断A、B是否相等(浮点数)
④HDU-1715:计算斐波那契数列第N项(N<1000)
⑤18-19焦作区域赛E题:不是弱智题,建议自己做做看
⑥19银川区域赛I题:大数的任意进制转换
二.题解
1.A + B Problem II HDU - 1002
打印空行:System.out.println();
public class Main{
public static void main(String[]args) {
Scanner cin=new Scanner(System.in);
int T=cin.nextInt();
for(int Case=1;Case<=T;Case++) {
if(Case!=1) System.out.println();
BigInteger a=cin.nextBigInteger();
BigInteger b=cin.nextBigInteger();
System.out.println("Case "+Case+':');
System.out.println(a.toString()+" + "+b.toString()+" = "+a.add(b).toString());
}
}
}
2.大明A+B HDU - 1753
BigDecimal
类是用于运算大浮点数的类
方法stripTrailingZeros()
用于去掉末尾的0
由于运算结果可能表示为指数形式,所以使用方法toPlainString()
令其表示为小数形式
这道题需要多组输入,可以用Scanner类的hasNext
方法进行判断
public class Main {
public static void main(String[]args) {
Scanner cin=new Scanner(System.in);
while(cin.hasNext()) {
BigDecimal a=cin.nextBigDecimal();
BigDecimal b=cin.nextBigDecimal();
System.out.println(a.add(b).stripTrailingZeros().toPlainString());
}
}
}
3.A == B ? HDU - 2054
方法compareTo()
用于判断两个数是否相等
a.compareTo(b)
会返回一个int
型的值,若为0则表示a=b
,若为1则表示a>b
,若为-1则表示a<b
public class Main{
public static void main(String[]args) {
Scanner cin=new Scanner(System.in);
while(cin.hasNext()) {
BigDecimal a=cin.nextBigDecimal();
BigDecimal b=cin.nextBigDecimal();
String ans;
if(a.compareTo(b)==0) ans="YES";
else ans="NO";
System.out.println(ans);
}
}
}
4.大菲波数 HDU - 1715
注意:由于main方法是用关键字static
修饰的方法,而static
方法中只能操作同为static
类型的方法和变量
所以不妨将main方法外的所有变量和方法都用static
修饰
public class Main {
static BigInteger ans[]=new BigInteger[1005];
static void _pre() {
ans[1]=BigInteger.ONE;
ans[2]=ans[1];
for(int i=3;i<=1000;i++) {
ans[i]=ans[i-2].add(ans[i-1]);
}
}
public static void main(String[]args) {
Scanner cin=new Scanner(System.in);
_pre();
int n=cin.nextInt();
while(n>0) {
n--;
int temp=cin.nextInt();
System.out.println(ans[temp]);
}
}
}
5.Resistors in Parallel Gym - 102028E
找规律,答案是 2 × 3 × 5 × 7 × ⋅ ⋅ ⋅ 3 × 4 × 6 × 8 × ⋅ ⋅ ⋅ \frac{2×3×5×7×\cdot\cdot\cdot}{3×4×6×8×\cdot\cdot\cdot} 3×4×6×8×⋅⋅⋅2×3×5×7×⋅⋅⋅
分子是连续素数的乘积,分母是素数+1后的乘积
public class Main{
//素数筛
static int prime[]=new int[1005];
static int Isprime[]=new int[1005];
static int cnt=0;
static void get_prime() {
for(int i=2;i<=1000;i++) Isprime[i]=1;
for(int i=2;i<=1000;i++) {
if(Isprime[i]==1) prime[cnt++]=i;
for(int j=0;j<cnt&&prime[j]*i<=1000;j++) {
Isprime[prime[j]*i]=0;
if(i%prime[j]==0) break;
}
}
}
public static void main(String[]args) {
get_prime();
Scanner cin=new Scanner(System.in);
int T=cin.nextInt();
while(T>0) {
T--;
BigInteger n=cin.nextBigInteger();
BigInteger num=BigInteger.ONE;
BigInteger den=BigInteger.ONE;
for(int i=0;;i++) {
num=num.multiply(BigInteger.valueOf(prime[i]));
if(num.compareTo(n)==1) {
num=num.divide(BigInteger.valueOf(prime[i]));
break;
}
den=den.multiply(BigInteger.valueOf(prime[i]+1));
}
BigInteger d=num.gcd(den);
System.out.println(num.divide(d).toString()+'/'+den.divide(d).toString());
}
}
}
6.Base62 计蒜客 - 42389
坑点:注意输入为0时的输出
public class Main{
static BigInteger Fun1(String a,int radix) { //任意进制转十进制
BigInteger Base=BigInteger.ONE;
BigInteger ret=BigInteger.ZERO;
for(int i=a.length()-1;i>=0;i--) {
BigInteger temp;
char t=a.charAt(i);
if(t>='0'&&t<='9') temp=BigInteger.valueOf(t-'0');
else if(t>='A'&&t<='Z') temp=BigInteger.valueOf(t-'A'+10);
else temp=BigInteger.valueOf(t-'a'+36);
ret=ret.add(temp.multiply(Base));
Base=Base.multiply(BigInteger.valueOf(radix));
}
return ret;
}
static String Fun2(BigInteger a,int radix) { //十进制转任意进制
String ret="";
while(a.compareTo(BigInteger.ZERO)!=0) {
int temp=Integer.valueOf(a.mod(BigInteger.valueOf(radix)).toString());
char t;
if(temp<10) {t='0';t+=temp;}
else if(temp<36) {t='A';t+=(temp-10);}
else {t='a';t+=(temp-36);}
ret=t+ret;
a=a.divide(BigInteger.valueOf(radix));
}
return ret;
}
static String solve(int r1,String s1,int r2) { //任意进制间的转化
BigInteger temp=Fun1(s1,r1);
return Fun2(temp,r2);
}
public static void main(String[]args) {
Scanner cin=new Scanner(System.in);
int x,y;
String z;
x=cin.nextInt();
y=cin.nextInt();
z=cin.next();
if(z.charAt(0)=='0') System.out.println(0);
else System.out.println(solve(x,z,y));
}
}