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);
}
}