前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >备战蓝桥杯——大数处理BigInteger&BigDecimal

备战蓝桥杯——大数处理BigInteger&BigDecimal

作者头像
红目香薰
发布2024-12-11 07:43:12
发布2024-12-11 07:43:12
13500
代码可运行
举报
文章被收录于专栏:CSDNToQQCodeCSDNToQQCode
运行总次数:0
代码可运行

BigInteger大数处理(整数·无需处理浮点数)

代码示例,这里说明了基础的四则运算+取模运算。

加法函数:add 减法函数:subtract 乘法函数:multiply 除法函数:divide 取模函数:mod

代码语言:javascript
代码运行次数:0
复制
package temp01;

import java.math.BigInteger;

public class Test3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 这里是10个9
		BigInteger x = new BigInteger("9999999999");
		BigInteger y = new BigInteger("9999999999");
		// 四则运算·加法
		BigInteger add = x.add(y);
		System.out.println(add.toString());
		// 减法
		BigInteger subtract = x.subtract(y);
		System.out.println(subtract);
		// 乘法
		BigInteger multiply = x.multiply(y);
		System.out.println(multiply);
		// 除法
		BigInteger divide = x.divide(y);
		System.out.println(divide);
		// 取模
		BigInteger mod = x.mod(y);
		System.out.println(mod);
	}

}
题目示例——外星日历

某星系深处发现了文明遗迹。 他们的计数也是用十进制。 他们的文明也有日历。日历只有天数,没有年、月的概念。 有趣的是,他们也使用了类似“星期”的概念, 只不过他们的一个星期包含了9天, 为了方便,这里分别记为: A,B,C....H,I 从一些资料上看到, 他们的23日是星期E 他们的190日是星期A 他们的343251日是星期I 令人兴奋的是,他们居然也预见了“世界末日”的那天, 当然是一个很大很大的数字 651764141421415346185 请你计算一下,这遥远的一天是该文明的星期几? 你需要提交的是一个大写字母,表示该文明的星期几, 不要填写任何多余的内容。

代码语言:javascript
代码运行次数:0
复制
package temp01;

import java.math.BigInteger;

public class Test3 {

	public static void main(String[] args) {
		BigInteger x =  new BigInteger("651764141421415346185");
		BigInteger y = x.mod(new BigInteger("9"));
		int z = y.intValue();
		System.out.println((char)('A'+z-1));
	}
}

BigDecimal大数处理——浮点数

理论概述:

Java提供了两个专门的类进行高精度运算:BigInteger与BigDecimal,虽然Java原始变量都具有对应的封装类型,但是这两个变量没有对应的原始类型,而是通过方法来提供这两种类型的一些运算,其含义为普通类型能够做的操作,这两个类型对应都有,只是因为精度过大可能效率不够高。至于这两个类的具体操作可以参考JDK的相关API文档。 关于数据类型的一些技巧:若要求精度的结果,尽量避免使用float和double: float和double类型本身是为了做科学运算,即执行二进制浮点运算而设计,但是却不能提供完全精确的结果,所以在要求精度的数值中,避免使用float和double,float和double在货币运算中尤其不合适,要让float和double精确表达0.1也是不可能的事。测试一下下边这段代码就明白了:

结果是不是出乎意料,这个结果并不是偶然,而是JVM本身设计的目的决定的。而要解决这个问题,最好的办法是使用BigDecimal、int或者long进行相关运算,特别是货币运算,使用BigDecimal代替double是一个很好的办法。 BigDecimal唯一的缺点在于:BigDecimal没有相对应的原始类型,所以在进行基本数值运算的时候,需要进行方法调用才能操作,这样会使得和我们的编程习惯不相符合,若使用int和long,就需要进行简单的封装运算。 所以在要求精度答案的计算任务里面,一般慎用float和double,如果在进行商务运算,并且要求四舍五入或者简单的舍入行为,使用BigDecimal可能更加方便。所以尽量避免在精度运算中使用float和double,特别是我们常用的货币运算。

代码示例给出了四则运算与整除取余操作

加法函数:add 减法函数:subtract 乘法函数:multiply 除法函数:divide 除法取整函数:divideToIntegralValue 取模函数:remainder

代码语言:javascript
代码运行次数:0
复制
package temp01;

import java.math.BigDecimal;

public class Test2 {

	public static void main(String[] args) {
		BigDecimal x = new BigDecimal("2222");
		BigDecimal y = new BigDecimal("11111");
		// 加法
		BigDecimal add = x.add(y);
		System.out.println(add);
		// 减法
		BigDecimal subtract = x.subtract(y);
		System.out.println(subtract);
		// 乘法
		BigDecimal multiply = x.multiply(y);
		System.out.println(multiply);
		// 除法:divide(除数,保留小数位数,小数点处理方式)
		BigDecimal divide = x.divide(y,2,BigDecimal.ROUND_DOWN);
		System.out.println(divide);
		//除法取整
		BigDecimal divideToIntegralValue = x.divideToIntegralValue(y);
		System.out.println(divideToIntegralValue);
		//取模·余数
		BigDecimal remainder = x.remainder(y);
		System.out.println(remainder);
	}
}
题目示例——黄金分割

黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现。有时需要把这个数字求得很精确。 对于某些精密工程,常数的精度很重要。也许你听说过哈勃太空望远镜,它首次升空后就发现了一处人工加工错误,对那样一个庞然大物,其实只是镜面加工时有比头发丝还细许多倍的一处错误而已,却使它成了“近视眼”!! 言归正传,我们如何求得黄金分割数的尽可能精确的值呢?有许多方法。 比较简单的一种是用连分数: 1 黄金数 = -------------------------- 1 1 + -------------------- 1 1 + --------------- 1 1 + --------- 1 + ... 这个连分数计算的“层数”越多,它的值越接近黄金分割数。 请你利用这一特性,求出黄金分割数的足够精确值,要求四舍五入到小数点后100位。 小数点后3位的值为:0.618 小数点后4位的值为:0.6180 小数点后5位的值为:0.61803 小数点后7位的值为:0.6180340

逻辑写法
代码语言:javascript
代码运行次数:0
复制
package temp01;

import java.math.BigDecimal;

public class Test3 {

	public static void main(String[] args) {
		BigDecimal bd = new BigDecimal(1);
		for(int i=0;i<1000;i++)
		{
			bd = bd.add(BigDecimal.ONE);
			bd=BigDecimal.ONE.divide(bd,100,BigDecimal.ROUND_HALF_DOWN);
		}
		System.out.println(bd.toString());
	}
}
递归写法

递归写法的题目是这样的:

黄金分割数0.618与美学有重要的关系。舞台上报幕员所站的位置大约就是舞台宽度的0.618处, 墙上的画像一般也挂在房间高度的0.618处,甚至股票的波动据说也能找到0.618的影子.... 黄金分割数是个无理数,也就是无法表示为两个整数的比值。 0.618只是它的近似值,其真值可以通过对5开方减去1再除以2来获得, 我们取它的一个较精确的近似值:0.618034 有趣的是,一些简单的数列中也会包含这个无理数,这很令数学家震惊! 1 3 4 7 11 18 29 47 .... 称为“鲁卡斯队列”。它后面的每一个项都是前边两项的和。 如果观察前后两项的比值,即:1/3,3/4,4/7,7/11,11/18 ... 会发现它越来越接近于黄金分割数! 你的任务就是计算出从哪一项开始,这个比值四舍五入后已经达到了与0.618034一致的精度。 请写出该比值。格式是:分子/分母。比如:29/47

代码语言:javascript
代码运行次数:0
复制
package temp01;

import java.math.BigDecimal;

public class Test3 {

	public static double format(double d) {
		BigDecimal bd = new BigDecimal(d).setScale(6, BigDecimal.ROUND_HALF_UP);
		double dd = bd.doubleValue();//返回浮点数值
		return dd;
	}
 
	public static void f(int a, int b) {
		double d = format((double) a / b);
		if (d == 0.618034) {
			System.out.println(a + "/" + b + "=" + d);
			return;
		}
		f(b, a + b);
	}
 
	public static void main(String[] args) {
		f(1, 3);
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • BigInteger大数处理(整数·无需处理浮点数)
    • 题目示例——外星日历
  • BigDecimal大数处理——浮点数
    • 题目示例——黄金分割
      • 逻辑写法
      • 递归写法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档