PAT乙级1017,题目考的是大整数相除

1017 A除以B (20分)

本题要求计算A/B,其中A是不超过 1000 位的正整数,B是 1 位正整数。你需要输出商数Q和余数R,使得A=B×Q+R成立。

输入格式:

输入在一行中依次给出AB,中间以 1 空格分隔。

输出格式:

在一行中依次输出QR,中间以 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);
    }
}

猜你喜欢

转载自blog.csdn.net/CSDN_Lrcx/article/details/116139190