PAT (Basic Level) Practice 1017 A除以B

PAT (Basic Level) Practice 1017 A除以B

1.题目描述

在这里插入图片描述

2.思路及代码

注意事项

①大数要采用BufferedReader接收 ②频繁的字符串增删要考虑StringBuffer
一开始用scanner接收,全部超时,一个劲的想是不是算法不够高效,但是想半天也不知道怎么优化for循环。去看了下别人做法,发现要采用BufferedReader接收,恍然大悟。
(但是也发现很多人采用BigInteger类直接计算,我:???)
在这里插入图片描述

① 模拟除法过程

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	public static void main(String[] args) throws IOException {
		
		//采用BufferedReader输入
		BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in)); 
		String strs[] = buffer.readLine().split(" ");
		char a[] = strs[0].toCharArray();
		int b = strs[1].charAt(0) - '0';
		
		
		/*
		 * 计算 ‘a / b’ 
		 */
		
		//由于除数b只是一位数,因此模拟除法时每次至少取两位然后除以b,取两位最方便
		StringBuffer Q = new StringBuffer("");		//由于需要频繁进行字符串添加操作,采用StringBuffer记录商
		int  pre = 0, twoNumber;					//pre记录上一次运算的余数,初始为0
		for(char c : a) {
			twoNumber = pre * 10 + c - '0';			//pre与当前位结合,生成一个两位数
			Q.append(twoNumber / b);				//本次运算的商添加到Q尾部
			pre = twoNumber % b;					//记录新的余数
		}
		
		String ret = Q.toString();					
		if(ret.startsWith("0") && ret.length() != 1)//可能会以‘0’开始,去掉‘0’再输出
			System.out.print(ret.substring(1) + " " + pre);
		else										
			System.out.print(Q.toString() + " " + pre);
	}	
	
}

在这里插入图片描述

②与库函数比较

我又去试了试库函数,测了测速度

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;

public class Main {

	public static void main(String[] args) throws IOException {
		
		//采用BufferedReader输入
		BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in)); 
		String strs[] = buffer.readLine().split(" ");		
		
		/*
		 * 计算 ‘a / b’ 
		 */
		BigInteger a,b,q,r;
		a = new BigInteger(strs[0]);
		b = new BigInteger(strs[1]);
		q = a.divide(b);
		r = a.mod(b);
		System.out.print(q.toString() + " " + r.toString());
	}	
	
}

发现速度差距不大:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值