第一题在这里插入图片描述

笔记:

  1. 首先,第一个难点在于如何输入:“1234567890987654321123456789“这么大的数字,C++中最大的long long 数据类型所能表示范围:-2^63 ~ 2^63-1,仍然无法保存,这种情况就要将数字以字符数组的形式输入更合适。
  2. 以字符数组输入长数字之后,就要将每一个字符数字转换为整形数字,这里用的方法是:arr[i] - '0'。将数字字符减 ‘0’ 即可得到整型数字。
  3. 算出数字和之后,要根据每一位数字来输出不同的字符串,这时有两种方法,第一种是通过取模将每一位的数字算出来并保存,第二种是将数字转换为字符数组;我认为第二种更为简便,只需使用sprintf函数即可实现。
  4. sprintf函数使用格式:(目标字符串,“格式”,数字)
  sprintf(s, "%d", 123); //把整数123 打印成一个字符串保存在s 中
  1. 最后通过swtich分情况输出即可。

我的代码:

#include <iostream>
using namespace std;
int  main( ){
    char arr[100];
    int s = 0;
    char res[100];
    cin>>arr;
    for (int i = 0; i < strlen(arr); ++i) {
        s += arr[i] - '0';
    }
    sprintf(res,"%d",s);
    for (int i = 0; i < strlen(res); ++i) {
        switch (res[i]) {
            case '0':
                cout<<"ling";
                break;
            case '1':
                cout<<"yi";
                break;
            case '2':
                cout<<"er";
                break;
            case '3':
                cout<<"san";
                break;
            case '4':
                cout<<"si";
                break;
            case '5':
                cout<<"wu";
                break;
            case '6':
                cout<<"liu";
                break;
            case '7':
                cout<<"qi";
                break;
            case '8':
                cout<<"ba";
                break;
            case '9':
                cout<<"jiu";
                break;
        }
        if (i != strlen(res) - 1){
            cout<<" ";
        }
        else cout<<endl;
    }
}
//1234567890987654321123456789

第二题:

在这里插入图片描述

这道题的题意实在难以理解,想了好久还是不太明白

我的代码(部分正确):

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

int  main( ){
    int n,flag;
    char arr[100];
    int res[100];
    cin>>n;
    for (int i = 0; i < n; ++i) {
        flag = 1;
        cin>>arr;
        for (int j = 0; j < strlen(arr); ++j) {
            if (j == strlen(arr) - 1){
                flag = 1;
                break;
            }
            if (arr[j] == 'A'){
                if (arr[j+1] == 'A' || arr[j+1] == 'P' || arr[j+1] == ' ' || arr[j+1] == 'T'){continue;}
                else{
                    res[i] = 0;
                    flag = 0;
                    break;
                }
            }

            else if (arr[j] == 'P'){
                if (arr[j+1] == 'A' || arr[j+1] == ' '){continue;}
                else{
                    res[i] = 0;
                    flag = 0;
                    break;
                }
            }

            else if (arr[j] == 'T'){
                if (arr[j+1] == 'A' || arr[j+1] == ' '){continue;}
                else{
                    res[i] = 0;
                    flag = 0;
                    break;
                }
            }

            else{
                res[i] = 0;
                flag = 0;
                break;
            }
        }

        if (flag == 1){
            res[i] = 1;
        }
    }

    for (int i = 0; i < n; ++i) {
        if (res[i] == 1){
            if (i != n-1) {
                cout << "YES" << endl;
            }
            else cout << "YES";
        }
        else {
            if (i != n - 1) {
                cout << "NO" << endl;
            }
            else cout << "NO";
        }
    }
}

分析:(转载自这里

任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
那么正确的有这些:
PAT
APATA
AAPATAA
AAAPATAAA
…不说了,就是中间一个A左右加上等量的A(不加也行)都是正确的。

如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
拿上面的那几个正确的举例子,那么正确的有这些:
PAT —— 对于 aPbTc 来说ac是空,b是A。所以 PAAT 是正确的。同理PAAAAAT中间加多少个A都是正确哒~
APATA —— 对于aPbTc来说,abc都是A。所以 APAATAA 是正确的。再类推一下,那么 APAAATAAA 是正确的。
AAPATAA —— 对于aPbTc来说,a和c是AA,b是A。所以AAPAATAAAA是正确的,再类推一下,AAPAAATAAAAAA 是正确的~~
所以说规律就是,可以在P和T中间加A并且在T后面加A,要求必须是,中间加上一个A,末尾就得加上几倍的(P前面A的那个字符串)。换句话说就是,中间的A的个数如果是3,那么末尾的A的个数就得是开头A的个数的3倍。很巧,当中间A为一个的时候,末尾和开头A的个数必须相等正好是第二条的要求~

所以一句话总结字符串的要求:只能有一个P一个T,中间末尾和开头可以随便插入A。但是必须满足开头的A的个数 * 中间的A的个数 = 结尾的A的个数,而且P和T中间不能没有A~

#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;
}

第三题

在这里插入图片描述

我的代码:

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

struct Student{
    string name;
    string num;
    int score;
};
int  main( ){
    int n;
    int flag_max = 0;
    int flag_min = 0;
    int max = 0;
    int min = 0;
    Student stu[100];
    cin>>n;
    for (int i = 0; i < n; ++i) {
        cin>>stu[i].name>>stu[i].num>>stu[i].score;
        if (stu[i].score >= max){
            max = stu[i].score;
            flag_max = i;
        }
        if (stu[i].score <= min){
            min = stu[i].score;
            flag_min = i;
        }
    }
    cout<<stu[flag_max].name<<" "<<stu[flag_max].num<<endl;
    cout<<stu[flag_min].name<<" "<<stu[flag_min].num<<endl;
}

分析:

  1. 我定义了一个Student的结构体,这样可以让输入的数据分的更清楚,易于比较。
  2. 在网上看到了别人的代码,方法比较奇特:
#include<stdio.h>
using namespace std;
#include<algorithm>
typedef struct Student{ char name[11];   //注意不是char name[10]; char num[11]; int score;
}student;
bool cmp(Student a,Student b)   //运用c++中带有的sort()排序函数;进行降序排列
{ return a.score>b.score;
}
int main()
{ int n; scanf("%d",&n); Student stu[n]; for(int i=0;i<n;i++) { scanf("%s%s%d",(stu[i].name),(stu[i].num),&(stu[i].score)); getchar(); } sort(stu,stu+n,cmp); printf("%s %s\n",stu[0].name,stu[0].num); printf("%s %s\n",stu[n-1].name,stu[n-1].num); return 0;
}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐