题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805305181847552
这道题直接用BigInteger来做会超时,所以用大数除法来做。
那么大数除法怎么做呢?
请读者现在拿起笔,任意写两个数做除法。我们来观察其中有什么规律。
如:
被除数为13486 除数为4
被除数 除数 商 余数
1 4 0 1(一开始余数为0)
13 4 3 1
14 4 3 2
28 4 7 0
6 4 1 2
结果是 商为3371 余数为2。(关于13 14 28 6怎么来的一开始我也不懂,用笔在纸上模拟计算13486/4的过程就可以明白了!!!)
这下读者很轻易就看出了规律,是的,把被除数从最高为开始的每一位打出来分别与除数相除,得到商和余数,再把该余数10再加上下一位被除数作为新的被除数,重复此操作,由表格,商的位数一定和被除数的位数相同(开头的0最后再删去即可)。
本题解:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.Scanner;
public class B1017 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String s=in.readLine();
String [] a=s.split(" ");
int b=Integer.parseInt(a[1]);
int shang,divi,yu=0;
StringBuilder sb=new StringBuilder();
for(int i=0;i<a[0].length();i++) {
divi=yu*10+a[0].charAt(i)-'0';
sb.append(divi/b);//自动调用String.valueOf(int)方法转型
yu=divi%b;
}
if(sb.length()!=1&&sb.charAt(0)=='0')
System.out.println(sb.substring(1)+" "+yu);
else {
System.out.println(sb+" "+yu);
}
}
}
需要注意的是:本题要求A是不超过1000位的整数,也就意味着要处理最多位1000位的字符串。这时候用BufferReader(缓冲流)的readLine()输入比 用Scanner的nextLine()输入提升了15ms左右!后者提交的时候可能有些测试点超时。