1. 程式人生 > >PAT乙級——1017

PAT乙級——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

題目分析

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