PAT乙級題解1016-1020

1016 部分A+B

#include <stdio.h>

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

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

1017 A除以B

簡單的特殊除法模擬

#include <stdio.h>
#include <string.h>

#define MAX 1005

int bigDiv(char A[], int B, char Q[])
{
    int lenA = strlen(A);
    int cnt = 0;
    int d = 0;
    for (int i = 0; i < lenA; i++) {
        d = d * 10 + A[i] - '0';
        if (d >= B) {
            Q[cnt++] = d / B + '0';
            d %= B;
        } else if (cnt || lenA == 1) 
            Q[cnt++] = '0';
    }
    Q[cnt] = '\0';
    return d;
}

int main()
{
    char A[MAX], Q[MAX];
    int B, R;
    scanf("%s%d", A, &B);
    R = bigDiv(A, B, Q);
    printf("%s %d\n", Q, R);
    return 0;
}

1018 錘子剪刀布

#include <stdio.h>

int a[200], b[200];

char getMAX(int a[])
{
    char max = 'B';
    if (a['B'] < a['C'])
        max = 'C';
    if (a[max] < a['J'])
        max = 'J';
    return max;
}

int main()
{
    int n,hj = 0;
    char aa, bb;
    scanf("%d", &n);
    while (n-->0) {
        getchar();
        scanf("%c %c", &aa, &bb);
        if (aa == bb) {
            hj++;
            continue;
        }
        if (aa == 'J' && bb == 'B')
            a['J']++;
        if (aa == 'J' && bb == 'C')
            b['C']++;
        if (aa == 'C' && bb == 'B')
            b['B']++;
        if (bb == 'J' && aa == 'B')
            b['J']++;
        if (bb == 'J' && aa == 'C')
            a['C']++;
        if (bb == 'C' && aa == 'B')
            a['B']++;
    }
    int sumA = a['B'] + a['C'] + a['J'];
    int sumB = b['B'] + b['C'] + b['J'];
    printf("%d %d %d\n%d %d %d\n", sumA, hj, sumB, sumB, hj, sumA);
    printf("%c %c\n",getMAX(a), getMAX(b));
    return 0;
}

1019 數字黑洞

注意,6174和0000也要做一次運算顯示出來!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int compInc(const void *a, const void *b)
{
    return (*(int *)b) - (*(int *)a);
}

int compDec(const void *a, const void *b)
{
    return (*(int *)a) - (*(int *)b);
}

int notIorD(int n, int sign)
{
    int res = 0, a[4], cnt = 0;
    memset(a, 0, sizeof(a));
    while (n) {
        a[cnt++] = n % 10;
        n /= 10;
    }
    if (sign)
        qsort(a, 4, sizeof(int), compInc);
    else 
        qsort(a, 4, sizeof(int), compDec);
    for (int i = 0; i < 4; i++)
        res = res * 10 + a[i];
    return res;
}
int main()
{
    int n;
    scanf("%d", &n);
    do {
        int tmp1 = notIorD(n, 1);
        int tmp2 = notIorD(n, 0);
        n = tmp1 -tmp2;
        printf("%04d - %04d = %04d\n", tmp1, tmp2, n);
    } while (n != 0 && n != 6174);
    return 0;
}

1020 月餅

注意讀題審題,分清正數和正整數!!!

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAX (int)1e3+5
typedef struct{
    double save;
    double sale;
}MoCake;

int comp(const void *a, const void *b)
{
    MoCake *aa = (MoCake *)a;
    MoCake *bb = (MoCake *)b;
    double aaa = aa->sale / aa->save;
    double bbb = bb->sale / bb->save;
    if(aaa > bbb)
        return -1;
    else
        return 1;
}

int main()
{
    MoCake m[MAX];
    int n, d;
    scanf("%d%d", &n, &d);
    for (int i = 0; i < n; i++)
        scanf("%lf", &m[i].save);
    for (int i = 0; i < n; i++)
        scanf("%lf", &m[i].sale);

    qsort(m, n, sizeof(MoCake), comp);
    double sum = 0;
    for (int i = 0; i < n; i++) {
        if (d <= m[i].save) {
            sum += m[i].sale / m[i].save * d;
            break;
        } else {
            d -= m[i].save;
            sum += m[i].sale;
        }
    }
    printf("%.2lf\n", sum);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章