PAT (Basic Level) 乙组全题记录

前后12天,乙组的所有题目算是刷完了,总体感觉不太难,偶尔有一两道题卡了一会也是审题不清、特殊数据,或者一些逃不掉的坑,但收获依然不少,明白了“永远要用最大的恶意去揣测出题人”,也改掉不少坏习惯,甲组的题目寒假才有时间继续做了。2020.3月,PAT 干。

1001 害死人不偿命的(3n+1)猜想

#include <iostream>
using namespace std;

int main() {
    int n, cnt = 0;
    cin >> n;
    while (n != 1) {
        if (n & 1) n = 3 * n + 1;
        n = n / 2;
        cnt++;
    }
    printf("%d", cnt);
    return 0;
}

1002 写出这个数

#include <iostream>
#include <cstdio>

using namespace std;

string map[10] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu"};

int main() {
#ifdef LOCAL
    fstream cin("data.in");
#endif // LOCAL
    int res = 0;
    char c;
    while (cin >> c) {
        res += c - '0';
    }
    stack<int>s;
    
    while (res) {
        s.push(res % 10);
        res /= 10;
    }
    while (!s.empty()) {
        cout << map[s.top()];
        s.pop();
        if (!s.empty())
            cout << " ";
        
    }
    return 0;
}

 

1003 我要通过!

#include <iostream>
#include <map>
using namespace std;
int main() {
    int n, p = 0, t = 0;
    string s;
    cin >> n;
    for(int i = 0; i < n; i++) {
        cin >> s;
        map<char, int> m;
        for(int j = 0; j < s.size(); j++) {
            m[s[j]]++;
            if (s[j] == 'P') p = j;
            if (s[j] == 'T') t = j;
        }
        if (m['P'] == 1 && m['A'] != 0 && m['T'] == 1 && m.size() == 3 && t-p != 1 && p * (t-p-1) == s.length()-t-1)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

1004 成绩排名

#include <iostream>
#include <algorithm>
using namespace std;

struct SS {
    string name, id;
    int grade;
    bool operator<(SS a) {
        return grade > a.grade;
    }
}stu[105];

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> stu[i].name >> stu[i].id >> stu[i].grade;
    }
    sort(stu, stu + n);
    
    cout << stu[0].name << ' ' << stu[0].id << endl;
    cout << stu[n - 1].name << ' ' << stu[n - 1].id << endl;
    return 0;
}

1005 继续(3n+1)猜想

#include <iostream>
using namespace std;

int pre[10005];

int FIND(int x) {
    return x == pre[x] ? pre[x] : pre[x] = FIND(pre[x]);
}

void fun(int n) {
    if (n == 1)return ;
    if (n & 1) {
        pre[(3 * n + 1) / 2] = n;
        fun((3 * n + 1) / 2);
    }
        
    else {
        pre[n / 2] = n;
        fun(n / 2);
    }
        
}

int main() {
    int k;
    cin >> k;

    while (k--) {
        int n;
        cin >> n;
        if (!pre[n])
            pre[n] = n;
        fun(n);
    }
    int cnt = 0;
    for (int i = 100; i >= 1; i--) {
        if (pre[i] == i) {
            cnt++;
        }
    }
    for (int i = 100; i >= 1; i--) {
        if (pre[i] == i) {
            cout << i;
            cnt--;
            if (cnt != 0)cout << ' ';

        }
    }
    return 0;
}

1006 换个格式输出整数

#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    string s;
    cin >> s;
    if (s.size() == 3) {
        int len = s[0] - '0';
        for (int i = 0; i < len; i++) {
            putchar('B');
        }
    }
    if (s.size() >= 2) {
        int len = s[s.size() - 2] - '0';
        for (int i = 0; i < len; i++) {
            putchar('S');
        }
    }
    if (s.size() >= 1) {
        int len = s[s.size() - 1] - '0';
        for (int i = 1; i <= len; i++) {
            putchar(i + '0');
        }
    }
    return 0;
}

1007 素数对猜想

#include <iostream>
#include <cstdio>
using namespace std;

bool M[100005];
int prime[50005];
int total;
void Eulersieve(int n) {
    for (int i = 2; i <= n; i++) {
        if (!M[i])  prime[total++] = i;
        for (int j = 0; j < total && i * prime[j] <= n; j++) {
                M[i * prime[j]] = true;
                if (i % prime[j] == 0)break;
            }
        
    }
}

int main() {
    int n, res = 0;
    cin >> n;
    Eulersieve(n);

    for (int i = 1; i < total; i++) {
        if (prime[i] - prime[i - 1] == 2) {
            res++;
        }
    }
    printf("%d\n", res);
    return 0;
}

1008 数组元素循环右移问题

#include <iostream>
#include <cstdio>
using namespace std;

int arr[105];

int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    int k = (n - m) % n;
    while (k < 0) {
        k += n;
    }
    printf("%d", arr[k]);
    k = (k + 1) % n;
    for (int i = 0; i < n - 1; i++) {
        printf(" %d", arr[k]);
        k = (k + 1) % n;
    }
    return 0;
}

1009 说反话

#include <iostream>
#include <string>
#include <stack>
#include <cstdio>
using namespace std;

int main() {
    string s;
    stack<string >q;
    while (cin >> s) {
        q.push(s);
        if (getchar() == '\n')break;
    }
    while (!q.empty()) {
        cout << q.top();
        q.pop();
        if (!q.empty())cout << ' ';
        
    }
    return 0;
}

1010 一元多项式求导

#include<iostream>
using namespace std;
int main(){
    int coef;
    int expo;
    cin >> coef >> expo;
    if (expo == 0){
        cout << "0 0";
        return 0;
    }
    else
        cout << coef * expo << ' ' << expo - 1;
    while (cin >> coef >> expo)
        if (expo != 0)
            cout << ' ' << coef * expo << ' ' << expo - 1;
    return 0;
}

1011 A+B 和 C

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int T;
    cin >> T;
    for (int i = 1; i <= T; i++) {
        long long a, b, c;
        cin >> a >> b >> c;
        bool res = (a + b > c);
        cout <<boolalpha<< "Case #" << i << ": " << res << endl;
    }
    return 0;
}

1012 数字分类

#include <iostream>
#include <cstdio>
using namespace std;

int arr[1005];

int a[6];

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    int flag = 1, cnt = 0;
    bool a2_flag = false;
    for (int i = 0; i < n; i++) {
        if (arr[i] % 5 == 0 && !(arr[i] & 1)) {
            a[1] += arr[i];
        }
        else if (arr[i] % 5 == 1) {
            a[2] += flag * arr[i];
            flag = ~flag + 1;
            a2_flag = true;
        }
        else if (arr[i] % 5 == 2) {
            a[3]++;
        }
        else if (arr[i] % 5 == 3) {
            a[4] += arr[i];
            cnt++;
        }
        else if (arr[i] % 5 == 4) { //错误点,最后直接写了else
            if (arr[i] > a[5])a[5] = arr[i];
        }
    }
    if (a[1]) {
        printf("%d", a[1]);
    }
    else
        printf("N");
    for (int i = 2; i <= 5; i++) {
        if ((i != 2 && !a[i]) || (i == 2 && !a2_flag)) {
            printf(" N");
        }
        else {
            if (i == 4) {
                printf(" %.1lf", (double)a[i] / cnt);
            }
            else printf(" %d", a[i]);
        }
    }
    return 0;
}

1013 数素数

#include <iostream>
#include <cstdio>

using namespace std;
const int N = 200005;
bool M[N];
int prime[10005];
int total;
void EulerSieve() {
    for (int i = 2; i < N && total < 10005; i++) {
        if (!M[i]) {
            prime[total++] = i;
        }
        for (int j = 0; j < total && i * prime[j] < N; j++) {
            M[i * prime[j]] = true;
            if (i % prime[j] == 0)break;
        }
    }
}

int main() {
    EulerSieve();

    int m, n;
    cin >> m >> n;
    m--; n--;
    int k = 0;
    for (int i = m; i <= n; i++) {
        printf("%d", prime[i]);
        k++;
        
        if (k % 10 == 0) {
            printf("\n");
            continue;
        }
        if (i != n)printf(" ");
    }
    return 0;
}

1014 福尔摩斯的约会

#include <iostream>
#include <map>
#include <string>
#include <cstdio>
using namespace std;

string DAY[8] = { "","MON","TUE","WED","THU","FRI","SAT","SUN" };

int alphabet_judge(char c) {
    if (c >= 'a' && c <= 'z')return 1;
    if (c >= 'A' && c <= 'Z')return 2;
    return 0;
}

bool check1(char c) {
    if (c >= 'A' && c <= 'G')return true;
    return false;
}
bool check2(char c) {
    if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'N'))return true;
    return false;
}
int main() {
    string s1, s2, s3, s4;
    cin >> s1 >> s2 >> s3 >> s4;
    string day;
    int hours, minute;
    int len = s1.length() < s2.length() ? s1.length() : s2.length();
    int i;

    for (i = 0; i < len; i++) {
        if (check1(s1[i]) && s1[i] == s2[i]) {
            day = DAY[s1[i] - 'A' + 1];
            i++;
            break;
        }
    }

    for (; i < len; i++) {
        if (check2(s1[i]) && s1[i] == s2[i]) {
            hours = (s1[i] >= '0' && s1[i] <= '9') ? s1[i] - '0' : 10 +s1[i] - 'A';
            break;
        }
    }
    len = s3.length() < s4.length() ? s3.length() : s4.length();
    for (i = 0; i < len; i++) {
        if (alphabet_judge(s3[i]) && s3[i] == s4[i]) {
            minute = i;
            break;
        }
    }
    cout << day << ' ';
    printf("%02d:%02d", hours, minute);
    return 0;
}

1015 德才论

#include <iostream>
#include <queue>
#include <cstdio>
using namespace std;

struct stu {
    int id, moral, talent;
    bool operator<(stu s)const {
        if (moral + talent == s.moral + s.talent) {
            if (moral == s.moral) {
                return id > s.id;
            }
            return moral < s.moral;
        }
        return moral + talent < s.moral + s.talent;
    }
};
priority_queue<stu>q1, q2, q3, q4;

inline void print(priority_queue<stu>q) {
    while (!q.empty()) {
        stu s = q.top();
        q.pop();
        printf("%d %d %d\n", s.id, s.moral, s.talent);
    }

}
int main() {
    int n, least, standard;
    cin >> n >> least >> standard;
    for (int i = 0; i < n; i++) {
        stu s;
        scanf("%d%d%d", &s.id, &s.moral, &s.talent);
        if (s.moral >= least && s.talent >= least) {
            if (s.moral >= standard && s.talent >= standard) {
                q1.push(s);
            }
            else if (s.moral >= standard && s.talent < standard) {
                q2.push(s);
            }
            else if (s.moral < standard && s.talent < standard && s.moral >= s.talent) {
                q3.push(s);
            }
            else {
                q4.push(s);
            }
        }
    }
    printf("%d\n", q1.size() + q2.size() + q3.size() + q4.size());
    print(q1);
    print(q2);
    print(q3);
    print(q4);
    return 0;
}

1016 部分A+B

#include <iostream>
using namespace std;

long long getP(int a,int da) {
    long long pa = 0;
    while (a) {
        if (a % 10 == da) {
            pa += da;
            pa *= 10;
        }
        a /= 10;
    }
    pa /= 10;
    return pa;
}


int main() {
    
    int a, da, b, db;
    scanf("%d%d%d%d", &a, &da, &b, &db);
    printf("%lld", getP(a, da) + getP(b, db));
    return 0;
}

1017 A除以B

#include <string>
#include <vector>
#include <iostream>
using namespace std;

vector<int>res;
string a;
int x, b;

int main() {
    cin >> a >> b;
    int i = 0, temp;
    while ((temp = ((x << 3) + (x << 1) + (a[i] ^ 48))) / b == 0) {
        x = temp;
        i++;
    }
    for (; i < a.size(); i++) {
        x = (x << 3) + (x << 1) + (a[i] ^ 48);//x累计数字来进行除法计
        res.push_back(x / b);//存放结果
        x %= b;//除完后的余数
    }
    if (res.empty()) 
        res.push_back(0);
    for (i = 0; i < res.size(); i++) {
        cout << res[i];//输出
    }
    cout << ' ';
    cout << x << endl;
    return 0;
}

1018 锤子剪刀布

#include <cstdio>
#include <algorithm>
#include <map>
#include <string>
#include <vector>
#include <iostream>
using namespace std;

int A, B, C;//甲胜、乙胜、平局
int M_A[3], M_B[3];

int judge(char a,char b) {
    switch (a) {
    case 'C':
        if (b == 'C') return 0;
        if (b == 'B') return 1; 
        return -1;
    case 'B':
        if (b == 'B')return 0;
        if (b == 'J')return 1;
        return -1;
    case 'J':
        if (b == 'J')return 0;
        if (b == 'C')return 1;
        return -1;
    }
}
int getIndex(char c) {
    if (c == 'B')return 0;
    if (c == 'C')return 1;
    return 2;
}
char getLetter(int i) {
    if (i == 0)return 'B';
    if (i == 1)return 'C';
    return 'J';
}
int main() {
    int n;
    cin >> n;
    cin.ignore();
    for (int i = 0; i < n; i++) {
        char a, b;
        a = getchar(); getchar();
        b = getchar(); getchar();

        int temp = judge(a, b);
        if (temp == -1) {
            A++;
            M_A[getIndex(a)]++;
        }
        else if (temp == 1) {
            B++;
            M_B[getIndex(b)]++;
        }
        else C++;
    }

    printf("%d %d %d\n", A, C, n - A - C);
    printf("%d %d %d\n", B, C, n - B - C);
    
    int index_a = 0, index_b = 0;
    for (int i = 1; i < 3; i++) {
        if (M_A[i] > M_A[index_a]) {
            index_a = i;
        }
        if (M_B[i] > M_B[index_b]) {
            index_b = i;
        }
    }
    printf("%c %c", getLetter(index_a), getLetter(index_b));
    return 0;
}

1019 数字黑洞

#include <cstdio>
#include <string>
#include <vector>
#include <iostream>
using namespace std;

int getMin(int x) {
    int flag[10] = { 0 };
    for (int i = 0; i < 4; i++) {
        flag[x % 10] ++;
        x /= 10;
    }
    int res = 0;
    for (int i = 0; i < 10; i++) {
        while (flag[i]) {
            flag[i]--;
            res = res * 10 + i;
        }
    }
    return res;
}

int getMax(int x) {
    int flag[10] = { 0 };
    for (int i = 0; i < 4; i++) {
        flag[x % 10] ++;
        x /= 10;
    }
    int res = 0;
    for (int i = 9; i >= 0; i--) {
        while (flag[i]) {
            flag[i]--;
            res = res * 10 + i;
        }
    }
    return res;
}
int main() {
    int n;
    cin >> n;
    int flag[10] = { 0 };
    int temp = n;
    while (temp) {
        flag[temp % 10]++;
        if (flag[temp % 10] == 4) {
            printf("%04d - %04d = 0000\n", n, n);
            return 0;
        }
        temp /= 10;
    }
    int L, R;
    do {
        L = getMax(n), R = getMin(n);
        n = L - R;
        printf("%04d - %04d = %04d\n", L, R, n);
    } while (L - R != 6174);
    return 0;
}

1020 月饼

#include <iostream>
#include <map>
#include <cstdlib>
#include <ctime>
#include <algorithm>

using namespace std;
struct node {
    double value, weight;
    bool operator<(node a) {
        return value / weight > a.value / a.weight;
    }
}N[1005];

int main(){
    int n;
    double V, res = 0;
    cin >> n >> V;
    for (int i = 0; i < n; i++) {
        scanf("%lf", &N[i].weight);
    }
    for (int i = 0; i < n; i++) {
        scanf("%lf", &N[i].value);
    }
    sort(N, N + n);

    int i;
    for (i = 0; i < n && V - N[i].weight >= 0; i++) {
        res += N[i].value;
        V -= N[i].weight;
    }
    if (i != n && V > 0) {
        res += N[i].value * (V / N[i].weight);
    }
    printf("%.2lf", res);
    return 0;
}

1021 个位数统计

#include <iostream>
using namespace std;

int res[10];
int main() {
    char c;
    while ((c = getchar()) != '\n') {
        res[c - '0']++;
    }
    for (int i = 0; i < 10; i++) {
        if (res[i] != 0)
        printf("%d:%d\n", i, res[i]);
    }
    return 0;
}

1022 D进制的A+B

#include <iostream>
#include <cstdio>
using namespace std;

int res[35];

int main() {
    int a, b, n, D;
    scanf("%d%d%d", &a, &b, &D);
    n = a + b;
    if (n == 0) {
        printf("0");
    }
    else {
        int i = 0;
        while (n) {
            res[i++] = n % D;
            n /= D;
        }
        i--;
        for (; i >= 0; i--) {
            printf("%d", res[i]);
        }
    }
    
    printf("\n");
    return 0;
}

1023 组个最小数

#include <iostream>
using namespace std;

int cnt[10];

int main() {
    int k;  
    for (int i = 0; i < 10; i++) {
        scanf("%d", &k);
        cnt[i] = k;
    }
    for (int i = 1; i < 10; i++) {
        if (cnt[i]) {
            putchar(i + '0');
            cnt[i]--;
            break;
        }
    }
    for (int i = 0; i < 10; i++) {
        while (cnt[i]) {
            putchar(i + '0');
            cnt[i]--;
        }
    }
    return 0;
}

1024 科学计数法

#include <cstdio>
#include <algorithm>
#include <map>
#include <string>
#include <vector>
#include <iostream>
using namespace std;


int e;//指数
string fraction;//定点部分

int main() {
    string s;
    cin >> s;
    char sign1 = s[0];
    int i = 1;
    for (i = 1; s[i] != 'E'; i++) {
        if (s[i] != '.') {
            fraction.append(1, s[i]);
        }
    }
    char sign2 = s[++i];
    i++;
    for (; i < s.length(); i++) {
        e = (e << 3) + (e << 1) + (s[i] ^ 48);
    }

    if (sign1 == '-')
        putchar(sign1);

    if (e == 0) {
        putchar(fraction[0]);
        putchar('.');
        cout << fraction.substr(1);
        return 0;
    }
    
    if (sign2 == '-') {
        putchar('0');putchar('.');
        for (int i = 0; i < e - 1; i++) {
            putchar('0');
        }
        cout << fraction << endl;
    }
    else {
        if (e >= fraction.length() - 1) {
            cout << fraction;
            for (int i = 0; i < e - fraction.leng
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值