java的的高精度除法_AcWing 794. 高精度除法(java解析)

高精度除以低精度(A/b)

java模板

// A / b = C ... r, A >= 0, b > 0 r=余数

private static List div(List A, int b){

for(int i = A.size()-1 ; i >= 0 ; i--){ //除法是从最高位开始计算的

r = r * 10 + A.get(i);

A.set(i,r / b );

r %= b;

}

while(A.size() > 1 && A.get(A.size() -1) == 0) A.remove(A.size() - 1); //去除前导0

return A;

}

解析

1:(r*10+Ai)/b代表的是每一位的除法操作;每进行一次操作就会得出商的一位数;最终得出的余数r%b就是我们想要的余数

如图

12e4014db94af327e4ff52f2c85f60fc.png

r代表的就是红色圆圈画的1,1,2,也就是每次计算剩下的余数

r*10+Ai代表的是12,13,24

b就是0,11,11,22

最终的商就是每次除法操作得出的数字的组合:0112

最终余数就是r%b = 2;

import java.util.Scanner;

import java.util.List;

import java.util.ArrayList;

public class Main{

static int r = 0;

public static void main(String[] args){

Scanner in = new Scanner(System.in);

String a = in.next();

int b = in.nextInt();

List A = new ArrayList<>();

for(int i = a.length()-1 ; i >= 0 ; i--) A.add(a.charAt(i) - '0');

List C = div(A,b);

for(int i = C.size()-1 ; i >= 0 ; i--) System.out.print(C.get(i));

System.out.println();

System.out.println(r);

}

private static List div(List A, int b){

for(int i = A.size()-1 ; i >= 0 ; i--){

r = r * 10 + A.get(i);

A.set(i,r / b );

r %= b;

}

while(A.size() > 1 && A.get(A.size() -1) == 0) A.remove(A.size() - 1); //去除前导0

return A;

}

}

解析:

1:如果你是在原本的集合上设置值,那么是不用反转的;如果是开辟了一个新的数组,那么一定要记得反转Collection.reverse();

2:因为在这里把r声明成了成员变量,所以在div方法中没有传递r参数;是为了记忆模板的时候和加减乘保持一致性比较好记;所以可能和y总给的模板有些不一样;按照自己的习惯记就好了;

3:上面的第一部分psvm方法处理输入输出操作没啥可说的,多写几遍就熟悉了;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值