日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PAT甲级题目翻译+答案 AcWing(进位制)

發布時間:2025/3/19 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PAT甲级题目翻译+答案 AcWing(进位制) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1010 Radix (25 分)

  • 題意 :radix進制
  • 題意 :給兩個數和其中一個數的進制,問另一個數能否在某一進制下與這數相等
  • 思路 :如果tag等于2就交換,最后還是只需要處理tag為1這種情況,這種思路值得學習;第一步,將n1轉換成十進制,考慮這是否能存下,n1不超過十位數字,所以最大是十個z,也就是三十六進制,十個z小于1后面十個0,也就是小于361036^{10}3610,3e15多些,也就是說可以用long long存下;第二步,判斷n2在什么進制下等于target,注意n2可能不止36進制,比如n2是(10)b=b(10)_b=b(10)b?=b,n1最大又是3e15,所以我們最大可以弄一個3e15次方,所以枚舉的時候不止枚舉到36次 ,也就是說這個枚舉的區間非常大,我們就想到能否能用二分來求呢,我們發現,當枚舉的進制變大時,n2也會變大,這是一個單調的過程,所以我們可以用二分來求這個進制;
  • 二分需要一個左右邊界,右邊界是target+1,左邊界應該等于n2的最大的這一位加1
  • 在calc中,res可能會爆long long,如果太大,大于1e16了已經,我們知道n1最大值是3e15,此時一定無解,則直接返回1e18;注意calc中參數的進制r也是要用long long的
  • r如果直接取target,那么6 6 1 10這個樣例會返回6,但答案是7。
  • 注意代碼中多次將int主動轉成long long的情形
  • 兩個數相乘的結果可能long long也存不下,溢出可能變成負數也可能變成正數,所以要用double
  • 語法 :swap函數在algorithm 頭文件中
#include <iostream> #include <algorithm>using namespace std;typedef long long ll;int get(char c) {if (c <= '9') return c - '0';return c - 'a' + 10; }ll calc(string n, ll r) {ll res = 0;for (auto c : n){if ((double)res * r + get(c) > 1e16) return 1e18;res = res * r + get(c);}return res; }int main() {string n1, n2;cin >> n1 >> n2;int tag, radix;cin >> tag >> radix;if (tag == 2) swap(n1, n2);ll target = calc(n1, radix);ll l = 0, r = target + 1;// ll l = 0, r = max(target, 36ll);for (auto c : n2) l = max(l, (ll)get(c) + 1);while (l < r){ll mid = l + r >> 1;if (calc(n2, mid) >= target) r = mid; // == problem!else l = mid + 1;}if (calc(n2, r) == target) cout << r;else cout << "Impossible";return 0; }

1015 Reversible Primes (20 分)

  • 題意 :首先判斷N是不是質數。然后將N轉成D進制數,將D進制數翻轉后,轉回十進制數,看得到的這個數是否是質數。
  • 思路 :nnn%ddd是n在d進制下最后一位數,也就是在d進制下的個位,在翻轉后,這位應該是第一位,將翻轉后的結果變成十進制時是要從最高位開始做。這樣就將最后三步化為了一步。
  • 語法 :逗號表達式的值是最后一個的值;NNN最大是10510^5105,那么如果是二進制的話就會有十幾位,十五六位,所以得用longlonglong longlonglong存轉換之后的結果。
#include <iostream>using namespace std;typedef long long LL;bool is_prime(int n) {if (n == 1) return false;for (int i = 2; i * i <= n; i ++ )if (n % i == 0)return false;return true; }bool check(int n, int d) {if (!is_prime(n)) return false;LL r = 0;while (n){r = r * d + n % d;n /= d;}return is_prime(r); }int main() {int n, d;while (cin >> n >> d, n >= 1){if (check(n, d)) puts("Yes");else puts("No");}return 0; }

1019 General Palindromic Number (20 分)

  • 題意 :給出一個數和一個進制,判斷這個數在這個進制下的結果是否是回文數。
  • 思路 :判斷回文數(i只要<j就可以了);十進制轉其它進制,用vector存更方便;十進制轉其它進制,注意n為0的情況要特殊討論;十進制轉其它進制時,先得到的是其它進制下的最低位,因為它最先被放入vector,且在輸出其它進制下的這個數時,是從高位向低位輸出,所以先從vector的最后一位開始輸出。
  • 語法 :reverse函數在algorithm頭文件;使用vector記得加頭文件vector;vector最后一個元素,back()
#include <iostream> #include <vector>using namespace std;vector<int> nums;bool check() {for (int i = 0, j = nums.size() - 1; i < j; i ++ , j -- )if (nums[i] != nums[j])return false;return true; }int main() {int n, b;cin >> n >> b;if (!n) nums.push_back(0);while (n) nums.push_back(n % b), n /= b;if (check()) puts("Yes");else puts("No");cout << nums.back();for (int i = nums.size() - 2; i >= 0; i -- ) cout << ' ' << nums[i];return 0; }

1027 Colors in Mars (20 分)

  • 題意 :將輸入的十進制數轉為十三進制數
  • 思路 :注意這里輸入的十進制數最大為168,意味著轉化為十三進制后最多只有兩個數字,這也恰好可以解決題目要求的如果只有一位數字必須左添0,也就是說無論如何輸出的都是兩位數字的十三進制數;注意這種將十進制數轉為大于十的進制數的“get“方式。
  • 語法 :int轉char
#include <iostream>using namespace std;int a[3];char get(int x) {if (x > 9) return 'A' + x - 10;return '0' + x; }int main() {for (int i = 0; i < 3; i ++ ) cin >> a[i];cout << '#';for (int i = 0; i < 3; i ++ ) cout << get(a[i] / 13) << get(a[i] % 13);return 0; }

1100 Mars Numbers (20 分)

  • 思路 :重要的一點是高進制和低進制的英文單詞沒有重復,所以可以直接連接在同一個數組中
  • 語法 :stringstream頭文件為sstream
#include <iostream> #include <sstream>using namespace std;char names[][5] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};int get(string word) {for (int i = 0; i < 25; i ++ )if (names[i] == word){if (i < 13) return i;return 13 * (i - 12);}return -1; // 一定不會執行 }int main() {int T;cin >> T;getchar();while (T -- ){string line;getline(cin, line);stringstream ssin(line);if (line[0] <= '9'){int v;ssin >> v;if (v < 13) cout << names[v] << endl;else{cout << names[12 + v / 13];if (v % 13 != 0) cout << " " << names[v % 13];cout << endl;}}else{string word;int res = 0;while (ssin >> word) res += get(word);cout << res << endl;}} }

總結

以上是生活随笔為你收集整理的PAT甲级题目翻译+答案 AcWing(进位制)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。