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
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
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 普及组] 阶乘之和
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 欢乐的跳
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<n;i++)
a[i]=in.nextInt();
for(int i=0;i<n-1;i++) {
b[i]=Math.abs(a[i]-a[i+1]);
}
int flag=1;
for(int i=1;i<n;i++) { //数组b中查找是否有1-n-1
if(find_num(i, b)==true)continue;
else {flag=0;break;} //没找到则退出查找
}
if(flag==1)System.out.println("Jolly");
else System.out.println("Not jolly");
}
static boolean find_num(int n,int[] b){ //数组a中查找是否有数字n
for(int j=0;j<b.length;j++) {
if(b[j]==n)return true;
else continue;
}
return false;
}
}
未完待续。。。