PAT甲級 進制轉換題_C++題解

進制轉換題

PAT (Advanced Level) Practice 進制轉換題ios

目錄

  • 《算法筆記》 重點摘要
  • 1015 Reversible Primes (20)
  • 1019 General Palindromic Number (20)
  • 1027 Colors in Mars (20)
  • 1058 A+B in Hogwarts (20)
  • 1100 Mars Numbers (20)

《算法筆記》 3.5 進制轉換 重點摘要

P進制轉換爲Q進制,分兩步算法

  • P進制轉換爲10進制
// y 爲要求的 10進制數
// x 爲 P 進制數,循環中每次取一位
// product 在循環中不斷乘 P,獲得 P 的冪次
int y = 0, product = 1;
while (x != 0){
    y = y + (x % 10) * product;
    x = x / 10;
    product = product * P;
}
  • 10進制轉換爲Q進制
// 數組 z 用來存放所求 Q進制數的每一位
// num 爲 Q進制數的位數
int z[40], num = 0;
do {
    z[num++] = y % Q; // 除基取餘法
    y = y / Q;
} while (y != 0);
// z 數組從 z[num-1] 到 z[0] 即爲所求

1015 Reversible Primes (20)

#include<cstdio>
bool isPrime(int n)
{
    if (n <= 1) return false;
    for (int i = 2; i * i <= n; i++)
        if ( n % i == 0) return false;
    return true;
}
int revD(int n, int D)
{
    int n2D[20], num = 0, result = 0;
    do {
        n2D[num++] = n % D;
        n = n / D;
    } while(n > 0);
    for (int i = 0; i < num; i++) result = result * D + n2D[i];
    return result;
}
int main()
{
    int n, D;
    scanf("%d", &n);
    while (n >= 0){
        scanf("%d", &D);
        printf("%s",isPrime(n) && isPrime(revD(n,D)) ? "Yes\n" : "No\n");
        scanf("%d", &n);
    }
    return 0;
}
  • 記憶判斷素數函數
  • 記憶進制轉換函數
  • 注意:10進制轉D進制後獲得的D進制數是數組高位到地位,即反向,故轉換回10進制時只要從低位開始加便可獲得反轉的D進制對應的10進制

1019 General Palindromic Number (20)

#include<cstdio>
int main()
{
    int n, b, num = 0;
    scanf("%d%d", &n, &b);
    int bn[31] = {0};
    do {
        bn[num++] = n % b;
        n = n / b;
    } while (n > 0);
    bool isPalindromic = true;
    for (int i = 0; i < num/2; i++){
        if (bn[i] != bn[num-1-i]){
            isPalindromic = false;
            break;
        }
    }
    printf("%s", isPalindromic ? "Yes\n" : "No\n");
    printf("%d", bn[num-1]);
    for (int i = num - 2; i >= 0; i--) printf(" %d", bn[i]);
    return 0;
}
  • 記憶進制轉換函數,注意用 do while 保證 n 爲0狀況

1027 Colors in Mars (20)

#include<cstdio>
int main()
{
    int r, g, b;
    scanf("%d%d%d", &r, &g, &b);
    char RGB[8];
    char dec213[] = "0123456789ABC";
    RGB[0] = '#';
    RGB[1] = dec213[r/13];
    RGB[2] = dec213[r%13];
    RGB[3] = dec213[g/13];
    RGB[4] = dec213[g%13];
    RGB[5] = dec213[b/13];
    RGB[6] = dec213[b%13];
    RGB[7] = '\0';
    printf("%s",RGB);
    return 0;
}
  • char數組輸出問題
    • 有初始化時儘可能不要對字符數組長度進行定義,應該把這個長度交給系統來進行分配
    • 若用 %s 輸出,要遇到 '\0' 符號的時候,纔會中止輸出,因此初始化字符數組的時候最好以 '\0' 結尾
    • 若不以 '\0' 做字符數組結尾,用 %s 輸出會出錯,只能逐個輸出。
    • 使用字符串初始化字符數組時,比用字符逐個賦值要多佔用一個字節,用於存放 '\0' ,同時字符數組的長度不會去計算 '\0' ,可是數組佔有的字節數會將 '\0' 算上,是由系統自行來進行處理的
  • 參考:柳婼小姐姐的代碼
#include <cstdio>
using namespace std;
int main() {
    char c[14] = {"0123456789ABC"};
    printf("#");
    for(int i = 0; i < 3; i++) {
        int num;
        scanf("%d", &num);
        printf("%c%c", c[num/13], c[num%13]);
    }
    return 0;
}
  • 輸入一個數處理一個數,逐個字符進行輸出

1058 A+B in Hogwarts (20)

#include<cstdio>
int main()
{
    int Galleon1, Sickle1, Knut1, Galleon2, Sickle2, Knut2, carrySickle = 0, carryGalleon = 0;
    scanf("%d.%d.%d %d.%d.%d", &Galleon1, &Sickle1, &Knut1, &Galleon2, &Sickle2, &Knut2);
    int Knut = Knut1 + Knut2;
    if (Knut >= 29){
        carrySickle = Knut / 29;
        Knut = Knut % 29;
    }
    int Sickle = Sickle1 + Sickle2 + carrySickle;
    if (Sickle >= 17){
        carryGalleon = Sickle / 17;
        Sickle = Sickle % 17;
    }
    int Galleon = Galleon1 + Galleon2 + carryGalleon;
    printf("%d.%d.%d", Galleon, Sickle, Knut);
    return 0;
}
  • 注意沒有輸入的數據要初始化,如carrySickle、carryGalleon
  • 注意要先保存進位再求餘更新本位,不然會丟失進位信息

1100 Mars Numbers (20)

#include<string>
#include<map>
#include<iostream>
using namespace std;
int main()
{
    string ones[13] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
    string tens[13] = {"", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
    map<string, int> M2E;
    for (int i = 0; i < 13; i++) M2E.insert(pair<string, int>(ones[i], i));
    for (int i = 1; i < 13; i++) M2E.insert(pair<string, int>(tens[i], i*13));
    int N;
    cin >> N;
    getchar();
    string s;
    for (int i = 0; i < N; i++){
        getline(cin, s);
        if (s[0] >= '0' && s[0] <= '9'){
            int earth = stoi(s);
            if (earth/13) cout << tens[earth/13];
            if (earth/13 && earth%13) cout << " ";
            if (earth%13 || earth == 0) cout << ones[earth%13];
            cout << endl;
        }
        else{
            int earth = 0;
            if (s.length() > 4) earth = M2E[s.substr(0,3)] + M2E[s.substr(4,3)];
            else earth = M2E[s];
            cout << earth << endl;
        }
    }
    return 0;
}
  • 題目坑點:13的整倍數輸出時不用在低位加"tret",如39,應該輸出maa而不是maa tret。
  • 注意:輸入火星數字時中間可能有空格,須要用getline(),要用getchar()吸取前面輸入N後的換行符。
相關文章
相關標籤/搜索