大精度问题(java)
2014-05-07 23:18
281 查看
今天对大数问题进行了一次复习,简直停不下来啊,大精度也属于大数的范畴,对大精度也复习了一遍,以前用c语言编写大精度感觉好麻烦,也不是很好理解,用java感觉就是走了一条捷径,大数问题用的是BigInteger类,大精度用的是BigDecimal 类,就在nyist做了两个题,学习了一下这两个类的基本用法。
高精度幂
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=155
记得这个题以前在poj上看过,当时也卡了好久,最后还是请教了别人,用c语言写的,记得代码好长,差不多有100多行,今天重新用java做了一下,才不到20行的代码就解决啦~
时间限制:1000 ms | 内存限制:65535 KB
难度:3
描述
A+B问题早已经被大家所熟知了,是不是很无聊呢?现在大家来做一下A-B吧。
现在有两个实数A和B,聪明的你,能不能判断出A-B的值是否等于0呢?
输入有多组测试数据。每组数据包括两行,分别代表A和B。
它们的位数小于100,且每个数字前中可能包含+,- 号。
每个数字前面和后面都可能有多余的0。
每组测试数据后有一空行。
输出对于每组数据,输出一行。
如果A-B=0,输出YES,否则输出NO。
样例输入
样例输出
来源hdu改编
上传者ACM_丁国强
这道题也是大精度的比较基础的题,简单水过;
package com.nyist;
import java.math.BigDecimal;
import java.util.Scanner;
public class nyist524 {
public static void main(String[] args) {
Scanner scanf=new Scanner(System.in);
BigDecimal a,b,c;
while(scanf.hasNext())
{
a=scanf.nextBigDecimal();
b=scanf.nextBigDecimal();
c=a.subtract(b);
if(c.compareTo(BigDecimal.ZERO)==0)
{
System.out.println("YES");
}
else
System.out.println("NO");
}
}
}
/*subtract
public BigDecimal subtract(BigDecimal subtrahend)返回一个 BigDecimal,其值为 (this - subtrahend),其标度为 max(this.scale(), subtrahend.scale())。
参数:
subtrahend - 从此 BigDecimal 减去的值。
返回:
this - subtrahend
*/
/*compareTo
public int compareTo(BigDecimal val)将此 BigDecimal 与指定的 BigDecimal 比较。根据此方法,值相等但具有不同标度的两个 BigDecimal 对象(如,2.0 和 2.00)被认为是相等的。相对六个 boolean 比较运算符 (<, ==, >, >=, !=, <=) 中每一个运算符的各个方法,优先提供此方法。建议使用以下语句执行上述比较:(x.compareTo(y) <op> 0),其中 <op> 是六个比较运算符之一。
指定者:
接口 Comparable<BigDecimal> 中的 compareTo
参数:
val - 将此 BigDecimal 与之比较的 BigDecimal。
返回:
当此 BigDecimal 在数字上小于、等于或大于 val 时,返回 -1、0 或 1。
*/
学习还是不断的积累,对这些类和方法的使用,只有多用才会熟练!!
nyist 513
http://acm.nyist.net/JudgeOnline/problem.php?pid=513
今天又在南阳上做了几个大数有关的题;
这道题目有点略坑啊,开始做的时候wa的好几次,java中处理后面的0还是很好用的,这道题中间还要判断是否输入0的这种特殊情况,添上那段代码就果断ac啦~用java做大数题就是在刷水题啊~
高精度幂
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=155
package com.nyist; import java.math.BigDecimal; import java.util.Scanner; public class nyist155 { public static void main(String[] args) { Scanner scanf=new Scanner(System.in); while(scanf.hasNext()) { BigDecimal sum=scanf.nextBigDecimal(); int n=scanf.nextInt(); String res=sum.pow(n).stripTrailingZeros().toPlainString();//整数去掉小数点和后面的0 if(res.startsWith("0")) //去掉前导0 { res=res.substring(1); } System.out.println(res); } } } /*public BigDecimal pow(int n)返回其值为 (thisn) 的 BigDecimal,准确计算该幂,使其具有无限精度。 参数 n 必须在 0 到 999999999(包括)之间。ZERO.pow(0) 返回 ONE。 注意,未来版本可能会扩展此方法允许的指数范围。 参数: n - 此 BigDecimal 的幂。 返回: thisn 抛出: ArithmeticException - 如果 n 超出范围。 */ /*stripTrailingZeros public BigDecimal stripTrailingZeros()返回数值上等于此小数,但从该表示形式移除所有尾部零的 BigDecimal。例如,从 BigDecimal 值 600.0 中移除尾部零,该值具有的 [BigInteger, scale] 组件等于 [6000, 1],使用 [BigInteger, scale] 组件生成的 6E2 等于 [6, -2] 返回: 数值上等于移除所有尾部零的 BigDecimal。 */ /*toPlainString public String toPlainString()返回不带指数字段的此 BigDecimal 的字符串表示形式。对于具有正标度的值,小数点右边的数字个数用于指示标度。对于具有零或负标度的值,生成得到的字符串,好像将该值转换为在数值上等于具有零标度的值一样,并且好像零标度值的所有尾部零都出现在该结果中。 如果非标度值小于零,则整个字符串以减号 '-' ('\u002D') 为前缀。如果非标度值为零或正数,则没有任何符号字符作为前缀。 注意,如果将此方法的结果传递到 string constructor,则只需要恢复此 BigDecimal 的数值;新的 BigDecimal 的表示形式可以有不同的标度。尤其是,如果此 BigDecimal 具有负标度,则在由字符串构造方法进行处理时,此方法产生的字符串将具有零标度。 (此方法的作用类似于 1.4 和更早版本中的 toString 方法。) 返回: 不带指数字段的此 BigDecimal 的字符串表示形式。 */
记得这个题以前在poj上看过,当时也卡了好久,最后还是请教了别人,用c语言写的,记得代码好长,差不多有100多行,今天重新用java做了一下,才不到20行的代码就解决啦~
A-B Problem
时间限制:1000 ms | 内存限制:65535 KB难度:3
描述
A+B问题早已经被大家所熟知了,是不是很无聊呢?现在大家来做一下A-B吧。
现在有两个实数A和B,聪明的你,能不能判断出A-B的值是否等于0呢?
输入有多组测试数据。每组数据包括两行,分别代表A和B。
它们的位数小于100,且每个数字前中可能包含+,- 号。
每个数字前面和后面都可能有多余的0。
每组测试数据后有一空行。
输出对于每组数据,输出一行。
如果A-B=0,输出YES,否则输出NO。
样例输入
1 1 1.0 2.0
样例输出
YES NO
来源hdu改编
上传者ACM_丁国强
这道题也是大精度的比较基础的题,简单水过;
package com.nyist;
import java.math.BigDecimal;
import java.util.Scanner;
public class nyist524 {
public static void main(String[] args) {
Scanner scanf=new Scanner(System.in);
BigDecimal a,b,c;
while(scanf.hasNext())
{
a=scanf.nextBigDecimal();
b=scanf.nextBigDecimal();
c=a.subtract(b);
if(c.compareTo(BigDecimal.ZERO)==0)
{
System.out.println("YES");
}
else
System.out.println("NO");
}
}
}
/*subtract
public BigDecimal subtract(BigDecimal subtrahend)返回一个 BigDecimal,其值为 (this - subtrahend),其标度为 max(this.scale(), subtrahend.scale())。
参数:
subtrahend - 从此 BigDecimal 减去的值。
返回:
this - subtrahend
*/
/*compareTo
public int compareTo(BigDecimal val)将此 BigDecimal 与指定的 BigDecimal 比较。根据此方法,值相等但具有不同标度的两个 BigDecimal 对象(如,2.0 和 2.00)被认为是相等的。相对六个 boolean 比较运算符 (<, ==, >, >=, !=, <=) 中每一个运算符的各个方法,优先提供此方法。建议使用以下语句执行上述比较:(x.compareTo(y) <op> 0),其中 <op> 是六个比较运算符之一。
指定者:
接口 Comparable<BigDecimal> 中的 compareTo
参数:
val - 将此 BigDecimal 与之比较的 BigDecimal。
返回:
当此 BigDecimal 在数字上小于、等于或大于 val 时,返回 -1、0 或 1。
*/
学习还是不断的积累,对这些类和方法的使用,只有多用才会熟练!!
nyist 513
http://acm.nyist.net/JudgeOnline/problem.php?pid=513
今天又在南阳上做了几个大数有关的题;
package com.nyist; import java.math.BigDecimal; import java.util.Scanner; public class nyist513 { public static void main(String[] args) { Scanner cin=new Scanner(System.in); BigDecimal a,b,sum; while(cin.hasNext()) { a=cin.nextBigDecimal(); b=cin.nextBigDecimal(); sum=a.add(b); if(sum.compareTo(BigDecimal.ZERO)==0)//这个题主要是这里容易wa啊!要判断是否就是0的这种情况 System.out.println(0); else System.out.println(sum.stripTrailingZeros().toPlainString()); } } } /*stripTrailingZeros public BigDecimal stripTrailingZeros()返回数值上等于此小数,但从该表示形式移除所有尾部零的 BigDecimal。例如,从 BigDecimal 值 600.0 中移除尾部零,该值具有的 [BigInteger, scale] 组件等于 [6000, 1],使用 [BigInteger, scale] 组件生成的 6E2 等于 [6, -2] 返回: 数值上等于移除所有尾部零的 BigDecimal。 */ /* compareTo public int compareTo(BigDecimal val)将此 BigDecimal 与指定的 BigDecimal 比较。根据此方法,值相等但具有不同标度的两个 BigDecimal 对象(如,2.0 和 2.00)被认为是相等的。相对六个 boolean 比较运算符 (<, ==, >, >=, !=, <=) 中每一个运算符的各个方法,优先提供此方法。建议使用以下语句执行上述比较:(x.compareTo(y) <op> 0),其中 <op> 是六个比较运算符之一。 指定者: 接口 Comparable<BigDecimal> 中的 compareTo 参数: val - 将此 BigDecimal 与之比较的 BigDecimal。 返回: 当此 BigDecimal 在数字上小于、等于或大于 val 时,返回 -1、0 或 1。 */
这道题目有点略坑啊,开始做的时候wa的好几次,java中处理后面的0还是很好用的,这道题中间还要判断是否输入0的这种特殊情况,添上那段代码就果断ac啦~用java做大数题就是在刷水题啊~
相关文章推荐
- java中double和float精度丢失问题及解决方法
- 解决Java中Long类型转换成Json时,在Js代码调用时精度丢失的问题
- java.math.BigDecimal的精度问题
- 【转】JAVA程序中Float和Double精度丢失问题
- 关于Java中 求Logn/log2 的精度问题。
- java解决double和float精度不准确的问题
- java float double精度为什么会丢失?浅谈java的浮点数精度问题
- 关于java中Double类型运算精度问题
- Java的double的精度问题以及解决方案
- Java中的数字基本运算和精度问题
- Java中关于精度丢失的问题
- java中Double类型的运算精度丢失的问题
- JAVA基本数据类型范围和float、double精度问题
- 货币计算中的精度问题--java.math.BigDecimal
- java.math.BigDecimal类的用法 解决double计算精度问题
- Java中double数据类型计算会损失精度问题
- java 浮点类型精度不准的问题(待测试)
- java中float/double浮点数的计算失去精度问题(即小数位数增加的问题)
- Java浮点数计算精度问题总结
- 关于java中Double类型的运算精度问题