模拟与高精度算法

1、模拟

模拟就是用计算机来模拟题目中要求的操作。

模拟题目通常具有码量大、操作多、思路繁复的特点。由于它码量大,经常会出现难以查错的情况,如果在考试中写错是相当浪费时间的。

技巧

写模拟题时,遵循以下的建议有可能会提升做题速度:

  • 在动手写代码之前,在草纸上尽可能地写好要实现的流程。
  • 在代码中,尽量把每个部分模块化,写成函数、结构体或类。
  • 对于一些可能重复用到的概念,可以统一转化,方便处理:如,某题给你 "YY-MM-DD 时:分" 把它抽取到一个函数,处理成秒,会减少概念混淆。
  • 调试时分块调试。模块化的好处就是可以方便的单独调某一部分。
  • 写代码的时候一定要思路清晰,不要想到什么写什么,要按照落在纸上的步骤写。

2、高精度 

高精度计算也被称作大整数计算,运用了一些算法结构来支持更大整数间的运算(数字大小超过语言内建整型)。

  • 存储

在平常的实现中,高精度数字利用字符串表示,每一个字符表示数字的一个十进制位。因此可以说,高精度数值计算实际上是一种特别的字符串处理。

读入字符串时,数字最高位在字符串首(下标小的位置)。但是习惯上,下标最小的位置存放的是数字的 最低位,即存储反转的字符串。这么做的原因在于,数字的长度可能发生变化,但我们希望同样权值位始终保持对齐(例如,希望所有的个位都在下标 [0],所有的十位都在下标 [1]……);同时,加、减、乘的运算一般都从个位开始进行(回想小学的竖式运算~),这都给了「反转存储」以充分的理由。

  • java处理高精度

用Java来处理高精度问题,对我们来说都是一件很happy的事,简单易懂。用Java刷了一些题,感觉Java还不错,在处理高精度和进制转换中,调用库函数的来处理。

import java.math.BigInteger;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in); 
        BigInteger num1;
        num1 = scan.nextBigInteger();
        BigInteger num2;
        num2 = scan.nextBigInteger();
        //加法
        System.out.println(num1.add(num2));
        //减法
        System.out.println(num1.subtract(num2));
        //乘法
        System.out.println(num1.multiply(num2));
        //除法(相除取整)
        System.out.println(num1.divide(num2));
        //取余
        System.out.println(num1.mod(num2));
        //最大公约数GCD
        System.out.println(num1.gcd(num2));
        //取绝对值
        System.out.println(num1.abs());
        //取反
        System.out.println(num1.negate());
        //取最大值
        System.out.println(num1.max(num2));
        //取最小值
        System.out.println(num1.min(num2));
        //是否相等
        System.out.println(num1.equals(num2));
    }
}

BigInteger 常见相关用法:

  • 初始化:BigInteger sum=new BigInteger("1");//sum初始化为1
  • BigInteger.valueOf(int)int转换为BigInteger

3、高精度例题1 洛谷P1601 A+B Problem

模拟与高精度算法_第1张图片

package 模拟与高精度;

import java.math.BigInteger;
import java.util.Scanner;

public class P1601A加BProblem {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		BigInteger a=in.nextBigInteger();
		BigInteger b=in.nextBigInteger();
		System.out.println(a.add(b));
	}
}

4、高精度例题2  洛谷P1303 A*B Problem

模拟与高精度算法_第2张图片

package 模拟与高精度;

import java.math.BigInteger;
import java.util.Scanner;

public class P1303A乘BProblem {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		BigInteger a=in.nextBigInteger();
		BigInteger b=in.nextBigInteger();
		System.out.println(a.multiply(b));
	}
}

5、高精度例题3 洛谷P1009 [NOIP1998 普及组] 阶乘之和

模拟与高精度算法_第3张图片

package 模拟与高精度;

import java.math.BigInteger;
import java.util.Scanner;

public class P1009阶乘之和 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n=in.nextInt();
		BigInteger sum=new BigInteger("0");//sum初始化为0
		while(n>0) {
			sum=sum.add(jiecheng(n));
			//System.out.println(jiecheng(n));
			n--;
		}
		System.out.println(sum);
	}
	static BigInteger jiecheng(int n) {	//求阶乘
		BigInteger m;
		BigInteger sum=new BigInteger("1");
		while(n>0) {			
			m=BigInteger.valueOf(n); //将int转换为大数
			sum=sum.multiply(m);   //大数乘法:sum乘m
			n--;
		}
		return sum;
	}
}

6、模拟例题:洛谷P1152 欢乐的跳

标签:模拟,枚举,暴力,排序

模拟与高精度算法_第4张图片

package 排序;

import java.util.Scanner;

public class P1152欢乐的跳 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n=in.nextInt();
		int a[]=new int[n];
		int b[]=new int[n-1];//记录两个连续元素之间差的绝对值
		for(int i=0;i

未完待续。。。

你可能感兴趣的:(算法专项,高精度,模拟,Java,高精度算法,BigInteger)