模拟与高精度算法

本文介绍了如何通过模拟和高精度计算解决编程问题,包括使用Java BigInteger处理大整数运算,以及通过实例演示了洛谷上的P1601A+B、P1303A*B和阶乘之和问题。技巧分享了模块化编程、调试策略和代码组织建议。
摘要由CSDN通过智能技术生成

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;
	}
}

未完待续。。。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值