高精度

高精度加法

我第一次用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);
		}
		*/

	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值