7、A除以B

题目描述

本题要求计算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

 因此在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值

猜你喜欢

转载自blog.csdn.net/fuyuwei2015/article/details/81878541
今日推荐