PAT乙级1017,题目考的是大整数相除
1017 A除以B (20分)
本题要求计算A/B,其中A是不超过 1000 位的正整数,B是 1 位正整数。你需要输出商数Q和余数R,使得A=B×Q+R成立。
输入格式:
输入在一行中依次给出A和B,中间以 1 空格分隔。
输出格式:
在一行中依次输出Q和R,中间以 1 空格分隔。
输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3
题目解析: A是不超过1000位的正整数,远远超过int,long的范围,所以只能用String存储这个大数字,符合大整数相除。用每一位和B相除,除数输出,余数*10加到下一位然后再和B相除,依次进行直到最后一位。
需要注意,比如给了12345 5第一位是1,1/5=0,但是一个数字第一位不应该是0,所以我这里用Boolean类型来标记如果出现了第一个0,应该不予输出。
还有一个棘手的问题就是这道题目的时间限制是100ms,稍微一不注意就会造成超时,所以这里不能用Scanner来接受控制台录入了,应该使用更快速的方式:
使用BufferedReader要么抛出异常要么try catch一下
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
这一行代码在PAT甲级的时候常用,如果这段代码看不懂的需要自己学习JAVA SE I/O流部分。 AC代码:
import java.io.BufferedReader; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws Exception{ BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String str[]=br.readLine().split("\s+"); String A=str[0];//得到第一个数的字符串 int B=Integer.parseInt(str[1]);//得到第二个数 /*最后的输出 StringBuilder和StringBuffer的方法使用起来基本一致 只不过StringBuilder单线程使用效率更高,StringBuffer多线程更安全 我们这里是单线程,所以使用StringBuilder,效率更高。 */ StringBuilder result=new StringBuilder(); int shang=0,yu=0;//定义商,余数 //标记第一个0 boolean flag=true; for(int i=0;i<A.length();i++){ shang=(A.charAt(i)-0+yu*10)/B; yu=(A.charAt(i)-0+yu*10)%B; if(flag){ if(shang==0){ continue;//第一个商是0,不能执行下面的添加,所以要跳出循环 }else{ flag=false;//标记为false之后if就不执行了 } } result.append(shang);//把商添加到result中 } //这种情况是第一个数字为0,比如0 2 if(result.length()==0) result.append(0); //输出最后结果 System.out.print(result+" "+yu); } }