题目描述
本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。
输入描述:
输入在1行中依次给出A和B,中间以1空格分隔。
输出描述:
在1行中依次输出Q和R,中间以1空格分隔。
输入例子:
123456789050987654321 7
输出例子:
17636684150141093474 3
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Scanner;
/**
* 数字字符串运算
* @author fuyuw
* 2018年8月20日 下午9:21:46
* BigDecimal类数据的处理和"Non-terminating decimal expansion; no exact representable decimal result"问题
*/
public class Main {
private static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
String A = input.next();
int B = input.nextInt();
BigDecimal bigA = new BigDecimal(A);
BigDecimal bigB = new BigDecimal(B);
BigDecimal Q = bigA.divide(bigB, 0, RoundingMode.DOWN);
BigDecimal R = bigA.subtract(bigB.multiply(Q));
System.out.println(Q+" "+R);
}
}
测试用例范围内最高耗时60ms,最大占用内存11080KB
【总结】
1、BigDecimal Q = bigA.divide(bigB);代码中如果写成这样会抛出Non-terminating decimal expansion; no exact representable decimal result异常,意思是【无法结束的除法表达式;没有精确的除结果】需要按小数模式处理。
2、BigDecimal底层原理是数字数组偏移量操作(具体没怎么细看)
3、BigDecimal 和String 一样具有对象不可变行,一旦赋值就不会再变
例如:
BigDecimal b= new BigDecimal("0.1");
b.add( new BigDecimal("0.9"));
System.out.println("b:" + b);// 输出0.1
因此在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值