PAT乙級——1017
阿新 • • 發佈:2018-12-15
題目: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
題目分析
int 型 和 long 型的資料都是有一定長度限制的,遠遠的低於1000
public class Main {
public static void main(String[ ] args) {
System.out.println("Integer.MIN_VALUE = " + Integer.MIN_VALUE);
System.out.println("Integer.MAX_VALUE = " + Integer.MAX_VALUE);
System.out.println("Long.MIN_VALUE = " + Long.MIN_VALUE);
System.out.println("Long.MAX_VALUE = " + Long.MAX_VALUE);
System. out.println("Float.MIN_VALUE = " + Float.MIN_VALUE);
System.out.println("Float.MIN_NORMAL = " + Float.MIN_NORMAL);
System.out.println("Float.MAX_VALUE = " + Float.MAX_VALUE);
System.out.println("Double.MAX_VALUE = " + Double.MAX_VALUE);
System.out.println("Double.MIN_VALUE = " + Double.MIN_VALUE);
}
}
使用上面程式碼可以得出結果如下圖 可以知道用java常見的型別是無法進行計算的。 對於這種問題java提供了一個BigInteger類,可以用來儲存,並有對應的加減乘除的方法,但是兩個運算元都必須是BIgInteger型。這個在PAT中運算是超時的。在工程中若是不求時間的話可以考慮與這個。
故模擬除法,每一位拿出來除以被除數
B,商
不管,餘數×10加上下一位
,變成新的被除數
。再一輪除以除數
。
最後一輪的餘數即為最終剩下的餘數。
//程式碼實現可以通過例子程式,是提交全部超時。
import java.util.Scanner;
public class Y1017 {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String A=in.next();
int B =in.nextInt();
in.close();
int t = 0,R,Q;
if(A.length()==1&&A.charAt(0)!='0'){
t=(A.charAt(0)-'0')/B;
R=(A.charAt(0)-'0')%B;
System.out.print(t+" "+R);
}
for (int i = 0; i < A.length(); i++) {
t = t * 10 + A.charAt(i) - '0';
Q=t/B;
if(i!=0)
System.out.print(Q);
t = t % B;
}
System.out.print(" "+t);
}
}
參考了網上的程式
//採用了BufferReader和StringBuilder來快取讀入和類物件加快處理速度。
//只能說java在這裡太委屈了,C++同樣的程式碼和思路就不會被報超時
//看樣子以後要抽空轉C++刷題了
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 = new BufferedReader(new InputStreamReader(System.in));
String[] ab = bufferedReader.readLine().split(" ");
bufferedReader.close();
int b = Integer.parseInt(ab[1]), t = 0;
StringBuilder stringBuffer = new StringBuilder();
for (int i = 0; i < ab[0].length(); i++) {
t = t * 10 + ab[0].charAt(i) - '0';
stringBuffer.append((char)(t / b + '0'));
t = t % b;
}
String result = stringBuffer.toString();
if (result.charAt(0) == '0' && result.length() != 1) {
System.out.print(result.substring(1) + " " + t);
} else {
System.out.print(result + " " + t);
}
}
}```