团队程序设计天梯赛15分题

文章列举了在使用PTA进行程序设计类实验时遇到的一些常见问题,主要涉及字符串处理,如字符串输入输出、数据类型选择、乱码问题等,并给出了相应的AC代码示例和解决方案。这些问题包括但不限于大整数处理、字符串转换、字符输出格式等。
摘要由CSDN通过智能技术生成

1.L1-003 个位数统计PTA | 程序设计类实验辅助教学平台

#define int long long 之后一定要记住输入输出的时候要用%lld 

 AC不了的代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int a[10];
int main()
{
    int k;
    cin >> k;
    while (k) {
        a[k % 10]++;
        k /= 10;
    }
    for (int i = 0; i < 10; i++) {
        if (a[i]) printf("%d:%d\n", i, a[i]);
    }
    return 0;
}

 注意:

整数是存不了那么大的,只能用字符串

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int a[10];
int main()
{
    string s;
    cin >> s;
    for (int i = 0; i < s.size(); i++) {
        a[s[i] - '0']++;
    }
    for (int i = 0; i < 10; i++) {
        if (a[i]) printf("%d:%d\n", i, a[i]);
    }
    return 0;
}

2.L1-005 考试座位号PTA | 程序设计类实验辅助教学平台 

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
using namespace std;
#define int long long
const int N = 1010;
struct Stu {
    char s[20];
    int x, y;
}q[N];
signed main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> q[i].s >> q[i].x >> q[i].y;
    }
    int m;
    cin >> m;
    while (m--) {
        int x;
        cin >> x;
        for (int i = 0; i < n; i++) {
            if (q[i].x == x) {
                printf("%s %lld\n", q[i].s, q[i].y);
                break;
            }
        }
    }
}

 奇怪的是,我一开始用的是string,然后输出是乱码,不知道为什么,按之前做题的经验,有时候string可以,有时候char s[100]可以,那么就之后一个不行就换另一个(不过得注意头文件不一样)

 这是后面补的,注意,string s不能用%s输出,会出现乱码,所以用cout输出

 3.L1-015 跟奥巴马一起画方块PTA | 程序设计类实验辅助教学平台

15分拿10分:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
using namespace std;
#define int long long
signed main()
{
    int n;
    char ch;
    cin >> n >> ch;
    int m = n / 2 + 0.5;
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            printf("%c", ch);
        }
        printf("\n");
    }
}

原因在于n/2是整数的除法,直接整除了,已经取整了,应该改为n*0.5

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
using namespace std;
#define int long long
signed main()
{
    int n;
    char ch;
    cin >> n >> ch;
    int m = n *0.5 + 0.5;
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            printf("%c", ch);
        }
        printf("\n");
    }
}

4.L1-016 查验身份证PTA | 程序设计类实验辅助教学平台 

 同样,用string s输出会乱码,用char s[100]就可以了

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
using namespace std;
int dx[17] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
int cnt;
int main()
{
    int n;
    cin >> n;
    while (n--) {
        char s[100];
        cin >> s;
        int sum= 0;
        bool flag = true;
        for (int i = 0; i < strlen(s) - 1; i++) {
            if (s[i] >= '0' && s[i] <= '9') {
                sum += (s[i] - '0') * dx[i];
            }
            else {
                printf("%s\n", s);
                flag = false;
                cnt++;
                break;
            }
        }
        if (flag) {
            int z = sum % 11;
            char ch;
            if (z == 0) ch = '1';
            if (z == 1) ch = '0';
            if (z == 2) ch = 'X';
            if (z == 3) ch = '9';
            if (z == 4) ch = '8';
            if (z == 5) ch = '7';
            if (z == 6) ch = '6';
            if (z == 7) ch = '5';
            if (z == 8) ch = '4';
            if (z == 9) ch = '3';
            if (z == 10) ch = '2';
            if (ch != s[17]) {
                printf("%s\n", s);
                cnt++;
            }
        }
    }
    if (!cnt) printf("All passed\n");
    return 0;
}

 5.L1-017 到底有多二PTA | 程序设计类实验辅助教学平台

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
using namespace std;
bool flag1, flag2;
int cnt;
int main()
{
    char s[100];
    cin >> s;
    int n = strlen(s);
    double x = 1;
    if (s[0] == '-') flag1 = true;
    if ((s[n - 1] - '0') % 2 == 0) flag2 = true;
    for (int i = 0; i < n; i++) {
        if (s[i] == '2') cnt++;
    }
    if (flag1) n--;
    x = (double)cnt / n;
    if (flag1) x *= 1.5;
    if (flag2) x *= 2;
    printf("%.2f%%\n", x * 100);
    return 0;
}

6.L1-019 谁先倒PTA | 程序设计类实验辅助教学平台 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
using namespace std;
int cnt1, cnt2;
int main()
{
    int x, y;
    cin >> x >> y;
    int n;
    cin >> n;
    while (n--) {
        int a, b, c, d;
        cin >> a >> b >> c >> d;
        if (a + c == b && a + c == d) continue;
        if (a + c == b) cnt1++;
        if (a + c == d) cnt2++;
        if (x < cnt1) {
            printf("A\n%d\n", cnt2);
            break;
        }
        if (y < cnt2) {
            printf("B\n%d\n", cnt1);
            break;
        }
    }
    return 0;
}

7.L1-025 正整数A+BPTA | 程序设计类实验辅助教学平台 

13分: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
using namespace std;
char s1[100],s2[100];
bool flag1, flag2;
int a, b;
int main()
{
    cin >> s1>>s2;
    if (s1[0] < '1' || s1[0]>'9') flag1 = true;
    else {
        for (int i = 0; i < strlen(s1); i++) {
            if (s1[i] < '0' || s1[i]>'9') flag1 = true;
            else a = a * 10 + (s1[i] - '0');
        }
    }
    if (s2[0] < '1' || s2[0]>'9') flag2 = true;
    else {
        for (int i = 0; i < strlen(s2); i++) {
            if (s2[i] < '0' || s2[i]>'9') flag2 = true;
            else b = b * 10 + (s2[i] - '0');
        }
    }
    if (a < 1 || a>1000) flag1 = true;
    if (b < 1 || b>1000) flag2 = true;
    if (flag1 && flag2) printf("? + ? = ?");
    if (flag1 && !flag2) printf("? + %d = ?", b);
    if (!flag1 && !flag2) printf("%d + %d = %d",a,b,a+b);
    if (!flag1 && flag2) printf("%d + ? = ?", a);
    return 0;
}

 原因在于第二个字符串可能中间存在空格,而scanf遇到空格就会停止输入,所以第一个字符串能成功读取,但是第二个字符串可能只能读取一部分

 可以用getchar一个一个输入字符,当字符为换行符时才停止,不过得注意前面scanf遇到空格停止输入了,所以在第二个字符串前有一个空格,不能将该空格输进去,所以先用getchar()吸收掉这个空格

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
using namespace std;
char s1[100],s2[100];
bool flag1, flag2;
int a, b;
int cnt;
int main()
{
    scanf("%s", s1);
    char ch;
    getchar();
    ch = getchar();
    s2[cnt] = ch;
    while ((ch=getchar()) != '\n') {
        s2[++cnt] = ch;
    }
    if (s1[0] < '1' || s1[0]>'9') flag1 = true;
    else {
        for (int i = 0; i < strlen(s1); i++) {
            if (s1[i] < '0' || s1[i]>'9') flag1 = true;
            else a = a * 10 + (s1[i] - '0');
        }
    }
    if (s2[0] < '1' || s2[0]>'9') flag2 = true;
    else {
        for (int i = 0; i < strlen(s2); i++) {
            if (s2[i] < '0' || s2[i]>'9') flag2 = true;
            else b = b * 10 + (s2[i] - '0');
        }
    }
    if (a < 1 || a>1000) flag1 = true;
    if (b < 1 || b>1000) flag2 = true;
    if (flag1 && flag2) printf("? + ? = ?");
    if (flag1 && !flag2) printf("? + %d = ?", b);
    if (!flag1 && !flag2) printf("%d + %d = %d",a,b,a+b);
    if (!flag1 && flag2) printf("%d + ? = ?", a);
    return 0;
}

 8.L1-030 一帮一PTA | 程序设计类实验辅助教学平台

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
using namespace std;
const int N = 110;
struct Stu {
    int x;
    string s;
}q[N];
bool flag[N];
int main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> q[i].x >> q[i].s;
    }
    for (int i = 1; i <= n / 2; i++) {
        for (int j = n; j >= n / 2; j--) {
            if (!flag[j] &&( q[i].x ==1&&q[j].x==0||q[i].x==0&&q[j].x==1)) {
                cout << q[i].s << " " << q[j].s << endl;
                flag[j] = true;
                break;
            }
        }
    }
    return 0;
}

也就是说string s不能用%s输出,会出现乱码,所以用cout输出 

 9.L1-033 出生年PTA | 程序设计类实验辅助教学平台

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
using namespace std;
int cnt;
int cnt1;
int cnt2;
char s[20];
int a[20];
int main()
{
    int y, n;
    int i;
    cin >> y >> n;
    int m;
    for ( i = y;; i++) {
        m = i;
        cnt = 0;
        cnt2 = 0;
        memset(a, 0, sizeof a);
        while (m) {
            a[m % 10]++;
            m /= 10;
            cnt2++;
        }
        for (int i = 0; i < 10; i++) {
            if (a[i]) cnt++;
        }
        if (!a[0]&&cnt2<4) cnt++;
        if (cnt == n) {
            cout << cnt1 << " ";
            break;
        }
        cnt1++;
    }
    int a1 = i % 10;
    i /= 10;
    int a2 = i % 10;
    i /= 10;
    int a3 = i % 10;
    i /= 10;
    int a4 = i % 10;
    i /= 10;
    printf("%d%d%d%d\n", a4, a3, a2, a1);
    return 0;
}

10.L1-035 情人节PTA | 程序设计类实验辅助教学平台 

注意,string s不能用%s输出,会出现乱码,所以用cout输出 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
using namespace std;
const int N = 100010;
struct Peo {
    string s;
}q[N];
int cnt;
int main()
{
    for (int i = 0;; i++) {
        string s;
        cin >> s;
        if (s != ".") {
            q[i].s = s;
        }
        if (s == ".") {
            cnt = i - 1;
            break;
        }
    }
    if (cnt < 1) printf("Momo... No one is for you ...");
    if (cnt >= 1 && cnt < 13) cout << q[1].s<<" " << "is the only one for you...";
    if (cnt >= 13) cout << q[1].s << " and " << q[13].s << " " << "are inviting you to dinner...";
    return 0;
}

 11.L1-044 稳赢PTA | 程序设计类实验辅助教学平台

法一: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
using namespace std;
const int N = 100010;
struct Node {
    string s;
}q[N];
int cnt;
int main()
{
    int k;
    cin >> k;
    for (int i = 1;; i++) {
        string s;
        cin >> s;
        if (s != "End") {
            q[i].s = s;
        }
        else {
            cnt = i - 1;
            break;
        }
    }
    int res = 0;
    for (int i = 1; i <= cnt; i++) {
        res++;
        if (res <= k) {
            if (q[i].s == "ChuiZi") printf("Bu\n");
            if (q[i].s == "JianDao") printf("ChuiZi\n");
            if (q[i].s == "Bu") printf("JianDao\n");
        }
        if (res == k) {
            i++;
            res = 0;
            if (q[i].s == "ChuiZi") printf("ChuiZi\n");
            if (q[i].s == "JianDao") printf("JianDao\n");
            if (q[i].s == "Bu") printf("Bu\n");
        }
    }
    return 0;
}

法二: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
using namespace std;
const int N = 100010;
struct Node {
    string s;
}q[N];
int cnt;
int main()
{
    int k;
    cin >> k;
    for (int i = 1;; i++) {
        string s;
        cin >> s;
        if (s != "End") {
            q[i].s = s;
        }
        else {
            cnt = i - 1;
            break;
        }
    }
    int res = 0;
    for (int i = 1; i <= cnt; i++) {
        res++;
        if (res <= k) {
            if (q[i].s == "ChuiZi") printf("Bu\n");
            if (q[i].s == "JianDao") printf("ChuiZi\n");
            if (q[i].s == "Bu") printf("JianDao\n");
        }
        if (res == k+1) {
            res = 0;
            if (q[i].s == "ChuiZi") printf("ChuiZi\n");
            if (q[i].s == "JianDao") printf("JianDao\n");
            if (q[i].s == "Bu") printf("Bu\n");
        }
    }
    return 0;
}

12.L1-048 矩阵A乘以BPTA | 程序设计类实验辅助教学平台 

乘积矩阵:

A的第一行和B的第一列分别相乘的和构成C的第一行第一列,A的第一行和B的第二列分别相乘的和构成C的第一行第二列,以此类推 

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
#include<string>
using namespace std;
typedef long long LL;
const int N = 1010;
int a[N][N], b[N][N], c[N][N];
int main()
{
    int ra, ca, rb, cb;
    cin >> ra >> ca;
    for (int i = 1; i <= ra; i++) {
        for (int j = 1; j <= ca; j++) {
            cin >> a[i][j];
        }
    }
    cin >> rb >> cb;
    for (int i = 1; i <= rb; i++) {
        for (int j = 1; j <= cb; j++) {
            cin >> b[i][j];
        }
    }
    if (ca != rb) {
        printf("Error: %d != %d\n",ca,rb);
        return 0;
    }
    //如果匹配,就只有三个参数
    //i为a的行,j为b的列,k为a的列,k为b的行
    //i为c的行,j为c的列
    for (int i = 1; i <= ra; i++) {
        for (int j = 1; j <=cb; j++) {
            for (int k = 1; k <= ca; k++) {
                c[i][j] += a[i][k] * b[k][j];
            }
        }
    }
    cout << ra << " " << cb << endl;
    for (int i = 1; i <= ra; i++) {
        for (int j = 1; j <= cb; j++) {
            if(j<cb) cout << c[i][j] << " ";
            else cout << c[i][j];
        }
        cout << endl;
    }
    return 0;
}

13.L1-086 斯德哥尔摩火车上的题PTA | 程序设计类实验辅助教学平台 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
string s1,s2;
string ch1, ch2;
int main()
{
    cin >> s1 >> s2;
    for (int i = 1; i < s1.size(); i++) {
        if ((s1[i] - '0') % 2 == (s1[i - 1] - '0') % 2) {
            int x = s1[i] - '0', y = s1[i - 1] - '0';
            int m = max(x, y);
            ch1 += (char)(m + '0');
        }
    } 
    for (int i = 1; i < s2.size(); i++) {
        if ((s2[i] - '0') % 2 == (s2[i - 1] - '0') % 2) {
            int x = s2[i] - '0', y = s2[i - 1] - '0';
            int m = max(x, y);
            ch2 += (char)(m + '0');
        }
    }
    if (ch1 == ch2) cout << ch1 << endl;
    else {
        cout << ch1 << endl;
        cout << ch2 << endl;
    }
    return 0;
}

14.L1-085 试试手气PTA | 程序设计类实验辅助教学平台

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int a[20];
int cnt;
int main()
{
    for (int i = 1; i <= 6; i++) cin >> a[i];
    int n;
    cin >> n;
    int m;
        for (int i = 1; i <= 6; i++) {
            m = n;
            cnt = 6;
            while (m--) {
                if (cnt == a[i]) cnt--;
                cnt--;
            }
            a[i] = cnt+1;
        }
        for (int i = 1; i <= 6; i++) {
            if (i != 6) printf("%d ", a[i]);
            else printf("%d", a[i]);
        }
    return 0;
}

15.L1-077 大笨钟的心情PTA | 程序设计类实验辅助教学平台 

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int a[50];
int main()
{
    for (int i = 0; i < 24; i++) cin >> a[i];
    int num;
    cin >> num;
    while (num == 1 || num == 2 || num == 3 || num == 4 || num == 5 || num == 6 || num == 7 || num == 8 || num == 9 || num == 10 || num == 11 || num == 12 || num == 13 || num == 14 || num == 15 || num == 16 || num == 17 || num == 18 || num == 19 || num == 20 || num == 21 || num == 22 || num == 23 || num == 0)
    {
        if (a[num] > 50) cout <<a[num]<< " Yes" << endl;
        else cout <<a[num]<< " No" << endl;
        cin >> num;
    }
    return 0;
}

 16.L1-070 吃火锅PTA | 程序设计类实验辅助教学平台

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
using namespace std;
char ch;
char s[100];
int n;
bool flag;
int cnt1;
int cnt2;
int wi = 1;
bool st;
int main()
{
    while (1) {
        n = 0;
        memset(s, 0, sizeof s);
        while ((ch = getchar()) != '\n') {
            s[n++] = ch;
        }
        if (strcmp(s,".")==0) break;
        cnt1++;
        st = false;
        for (int i = 0; i < n; i++) {
            if (s[i] == 'c' && s[i + 1] == 'h' && s[i + 2] == 'i' && s[i + 3] == '1' && s[i + 4] == ' ' && s[i + 5] == 'h' && s[i + 6] == 'u' && s[i + 7] == 'o' && s[i + 8] == '3' && s[i + 9] == ' ' && s[i + 10] == 'g' && s[i + 11] == 'u' && s[i + 12] == 'o' && s[i + 13] == '1')
            {
                st = true;
                if (!flag) {
                    flag = true;
                    wi = cnt1;
                }
            }
        }
        if (st) cnt2++;
    }
    if (flag) {
        cout << cnt1 << endl;
        cout << wi << " " << cnt2 << endl;
    }
    else {
        cout<<cnt1<<endl;
        cout << "-_-#" << endl;
    }
    return 0;
}

 17.L1-069 胎压监测PTA | 程序设计类实验辅助教学平台

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
using namespace std;
int a[10];
int cnt;
int wi;
int main()
{
    int  x, y;
    cin >> a[1] >> a[2] >> a[3] >>a[4] >> x >> y;
    int m = max({ a[1],a[2],a[3],a[4]});
    for (int i = 1; i <= 4; i++) {
        if (!(a[i] >= x && m - a[i] <= y)) {
            wi = i;
            cnt++;
        }
    }
    if (cnt == 0) printf("Normal\n");
    if (cnt == 1) printf("Warning: please check #%d!\n",wi);
    if (cnt >= 2) printf("Warning: please check all the tires!\n");
    return 0;
}

18.L1-062 幸运彩票PTA | 程序设计类实验辅助教学平台 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
using namespace std;
int n;
int sum;
int res;
int main()
{
    cin >> n;
    while (n--) {
        sum = 0;
        res = 0;
        int x;
        cin >> x;
        sum += x % 10;
        x /= 10;
        sum += x % 10;
        x /= 10;
        sum += x % 10;
        x /= 10;
        res += x % 10;
        x /= 10;
        res += x % 10;
        x /= 10;
        res += x % 10;
        if (res == sum) printf("You are lucky!\n");
        else printf("Wish you good luck.\n");
    }
    return 0;
}

19.L1-058 6翻了PTA | 程序设计类实验辅助教学平台 

14分(还有1分不知道扣在哪里了,调试了好久,细节很多): 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
using namespace std;
char s[1010];
int n;
int cnt;
struct Node {
    string s1;
}q[1010];
int res;
int m;
string s3;
int main()
{
    char ch;
    while ((ch = getchar()) != '\n') {
        s[n++] = ch;
    }
    s[n] = ' ';//注意,最后加一个空格,因为遇到一个空格则视为一个单词
    int j;
    //存下每个单词,用双指针来枚举每个单词
    for (int i = 0; i <= n; i++) {
        for (j = i; s[j] != ' '; j++) {
            q[cnt].s1 += s[j];
        }
        //q[cnt].s1 += ' ';
        cnt++;
        i = j;
    }
    //for (int i = 0; i < cnt; i++) {
    //    cout << q[i].s1 << " " << q[i].s1.size() << endl;
    //    for (int j = 0; j < q[i].s1.size(); j++) cout << q[i].s1[j] << " ";
    //    cout << endl;
    //}
    for (int i = 0; i < cnt; i++) {
        res = 0;
        m = 0;
  //注意:j枚举到q[i].s1.size(),因为如果整个单词都是6的话,那么m就不会更新了  
        for (int j = 0; j <= q[i].s1.size(); j++) {
            if (q[i].s1[j] == '6') {
                res++;
                /*cout << "res:" << res << endl;*/
            }
            else {
                m = max(m, res);
                res = 0;
            }
        }
        /*cout <<"m:"<< m << endl;*/
        if (m <= 3) s3 += q[i].s1;
        if (m > 3 && m <= 9) s3 += "9";
        if (m > 9) s3 += "27";
        if (i < cnt - 1) s3 += " ";//注意,整行话的最后面不要加空格
    }

    cout << s3 << endl;
    return 0;
}

然后上网查了一下,发现不一定非得把所有单词都存下来,可以一边枚举一边输出

也不必枚举每个单词,只要一个字符一个字符枚举,看连续的6的个数即可

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
using namespace std;
const int N = 1010;
char s[N];
int cnt;
int t;
int main()
{
    char ch;
    while ((ch = getchar()) != '\n') {
        s[cnt] = ch;
        cnt++;
    }
    s[cnt] ='\n';//最后一个字符设为换行符的原因,一是可以取最后连续的6,二是最后换行不会影响格式,但是空格会影响
    for (int i = 0; i <= cnt; i++) {
        if (s[i] == '6') t++;
        else {
            if (t > 9) cout << "27";
            else if (t > 3) cout << "9";
            else {
                while (t--) {
                    cout << "6";
                }
            }
            t = 0;
            cout << s[i];
        }
    }
    return 0;
}

20.L1-054 福到了PTA | 程序设计类实验辅助教学平台 

c++函数getline(头文件为#include)可以读入一行,遇到换行符才停止

所以如果前面输入n的话,记得加一个getchar(),把换行符吸收掉

string s;

getline(cin,s);

reverse函数可以反转字符串

string s;(不能用于char s[100])

reverse(s.begin(),s.end());

 AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
#include<string>
using namespace std;
const int N = 1010;
struct Node {
    string s;
}q[N],p[N];
int cnt;
bool flag;
int main()
{
    char ch;
    int n;
    cin >> ch >> n;
    getchar();
    while (n--) {
        getline(cin,q[cnt].s);
        reverse(q[cnt].s.begin(), q[cnt].s.end());
        for (int i = 0; i < q[cnt].s.size(); i++) {
            if (q[cnt].s[i] != ' ') q[cnt].s[i] = ch;
        }
        p[cnt].s = q[cnt].s;
        cnt++;
    }
    for (int i = cnt - 1,j=0; i >= 0; i--,j++) {
        if (q[i].s != p[j].s) flag = true;
    }
    if (!flag) {
        printf("bu yong dao le\n");
        for (int i = cnt - 1; i >= 0; i--) cout << q[i].s << endl;
    }
    else {
        for (int i = cnt - 1; i >= 0; i--) cout << q[i].s << endl;
    }
    return 0;
}

21.L1-050 倒数第N个字符串PTA | 程序设计类实验辅助教学平台 

2019蓝桥杯年号字串和这题感觉有点类似,都是26进制

每一位都是0~25,所以就把a当作0,以此类推,z当作25

这样,abc转化为十进制就是2*26^0+1*26^1+0*26^2

该题先找到倒数第N个字符串对应的十进制是多少,应该先算出最后一个十进制是多少(每一位都是z,即25,类似于取十进制数的方法,一直*26+25就行了),再减去N,再加1就是倒数第N个字符串对应的十进制

然后,求出对应的26进制个位数,并转化成小写字母a~z

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
#include<string>
using namespace std;
typedef long long LL;
int a[20];
int cnt;
int main()
{
    int l, n;
    cin >> l >> n;
    LL m = 0;
    for (int i = 0; i < l; i++) {
        m=m*26+25;
    }
    m = m - n + 1;
    while (m) {
        a[cnt++] = m % 26;
        m /= 26;
    }
    for (int i = l - 1; i >= 0; i--) {
        cout << (char)(a[i] + 'a');
    }
    return 0;
}

22.L1-078 吉老师的回归PTA | 程序设计类实验辅助教学平台 

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<cstdio>
#include<string>
using namespace std;
typedef long long LL;
const int N = 50;
string s;
struct Node {
    string s;
}q[N];
bool st[N];
int cnt;
int res;
int main()
{
    int n, m;
    cin >> n >> m;
    getchar();
    //预处理好1到n道题是否打算要做以及打算做几道题
    for (int i = 1; i <= n; i++) {
        st[i] = false;
        getline(cin, q[i].s);
        for (int j = 0; j < q[i].s.size(); j++) {
            if (q[i].s[j] == 'q' && q[i].s[j + 1] == 'i' && q[i].s[j + 2] == 'a' && q[i].s[j + 3] == 'n' && q[i].s[j + 4] == 'd' && q[i].s[j + 5] == 'a' && q[i].s[j + 6] == 'o' || q[i].s[j] == 'e' && q[i].s[j + 1] == 'a' && q[i].s[j + 2] == 's' && q[i].s[j + 3] == 'y')
            {
                st[i] = true;//表示该道题(第i道题)不打算做
                break;
            }
        }
        if (!st[i]) cnt++;//打算做的题目个数
    }

    for (int i = 1; i <= n; i++) {
        if (!st[i]) res++;
        if (res == m) {
            if (res == cnt) {
                printf("Wo AK le\n");
                return 0;
            }
            else {
                cout << q[i+1].s<< endl;
                return 0;
            }
        }
    }
    printf("Wo AK le\n");//可能最后也没做到m道题,但所有的题目都过了一遍了,也是AK了
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值