高精度加法
我第一次用JAVA交题,第一次学习了高精度,蛮方便。
需要注意一点,就JAVA交题的话,类名必须为Main
import java.math.BigDecimal;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String a=in.next();
String b=in.next();
BigDecimal num1=new BigDecimal(a);
BigDecimal num2=new BigDecimal(b);
System.out.println(num1.add(num2));
}
}
P1255 数楼梯
https://www.luogu.org/problemnew/show/P1255
我尝试了一下,用BigInteger和BigDecimal 都可以
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
public class p1255{
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
/* BigInteger a[]=new BigInteger[n+1];
a[0]=BigInteger.ZERO;//0个阶梯,不用走,走的方式为0
if(n>=1)
a[1]=BigInteger.ONE;
if(n>=2)
a[2]=BigInteger.valueOf(2);
*/
BigDecimal a[]=new BigDecimal[n+1];
a[0]=BigDecimal.ZERO;//0个阶梯,不用走,走的方式为0
if(n>=1)
a[1]=BigDecimal.ONE;
if(n>=2)
a[2]=BigDecimal.valueOf(2);
for(int i=3;i<=n;i++){
a[i]=a[i-2].add(a[i-1]);
}
System.out.println(a[n]);
}
}
P1604 B进制星球
https://www.luogu.org/problemnew/show/P1604
神奇的操作:代码如下
import java.math.BigInteger;
import java.util.Scanner;
public class Bjinzhi {
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
int b=in.nextInt();
String t1=in.next();//这两个是b进制正整数
String t2=in.next();
//从原进制转换为10进制,这波操作是我学的
String s1=new BigInteger(t1,b).toString(10);
String s2=new BigInteger(t2,b).toString(10);
//两个十进制大数相加
BigInteger x=new BigInteger(s1);
BigInteger y=new BigInteger(s2);
BigInteger num=x.add(y);
//将相加结果转换为原进制
String ans=new BigInteger(num.toString(),10).toString(b);
System.out.println(ans.toUpperCase());
}
}
P1080 国王游戏(贪心加高精度)
https://www.luogu.org/problem/P1080
解析:
遇到问题,要记得像上一样,推一下,我当时做题就放弃了。由上述结论可知,为了让ans取得最小值,需要将左手右手的乘积越小的排在越前面,然后这题数据量巨大,所以用java高精度
一个Java知识点:要写两个类,一个类充当类似c++的结构体,那么这个类用class+类名 来写,一个全代码中只允许一个public类。还有一般不用类对象数组来定义, 类名为ss,采用下面的方法!!!,添加时也不是a[i].x,a[i].y, 而是a.add(new ss(x,y))
List的下标是从0开始的,这一点不要忘了。
List<ss> a = new ArrayList();
for (int i = 0; i <n; i++) {
x = in.nextInt();
y = in.nextInt();
a.add(new ss(x,y));
}
还有就是排序的用法
a.sort(new Comparator<ss>() {
@Override
public int compare(ss o1, ss o2) {
// TODO Auto-generated method stub
int t = o1.getX() * o1.getY() - o2.getX() * o2.getY();
return t;
}
});
完整代码如下:
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
class ss {
int x;
int y;
public ss(int x, int y) {
super();
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int compare(ss o1, ss o2) {
int t = o1.getX() * o1.getY() - o2.getX() * o2.getY();
return t;
}
}
public class P1080 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt(),x,y;
int a0=in.nextInt();
int b0=in.nextInt();
BigInteger ans=BigInteger.ONE;
BigInteger temp=BigInteger.ONE;
BigInteger p[]=new BigInteger[n+5];
p[0]=BigInteger.valueOf(a0);
List<ss> a = new ArrayList();
for (int i = 0; i <n; i++) {
x = in.nextInt();
y = in.nextInt();
a.add(new ss(x,y));
}
a.sort(new Comparator<ss>() {
@Override
public int compare(ss o1, ss o2) {
// TODO Auto-generated method stub
int t = o1.getX() * o1.getY() - o2.getX() * o2.getY();
return t;
}
});
/*BigInteger p[]=new BigInteger[n+1];用p存左手累计乘积
List<ss> a = new ArrayList();*/
for(int i=1;i<=n;i++)
{
p[i]=p[i-1].multiply(BigInteger.valueOf(a.get(i-1).x));
if(ans.compareTo(temp.multiply(p[i-1]).divide(BigInteger.valueOf(a.get(i-1).y)))<0)
ans=temp.multiply(p[i-1]).divide(BigInteger.valueOf(a.get(i-1).y));
}
System.out.println(ans);
/* for(ss s :a) {
System.out.println(s.x+" "+s.y);
}
*/
}
}