zoukankan      html  css  js  c++  java
  • 『ACM C++』 PTA 天梯赛练习集L1 | 025-026

    满课一天,做25的时候还疯狂WA,进度可以说是很慢了 哭泣

    ------------------------------------------------L1-025----------------------------------------------------------

    正整数A+B

    题的目标很简单,就是求两个正整数AB的和,其中AB都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。

    输入格式:

    输入在一行给出AB,其间以空格分开。问题是AB不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。

    注意:我们把输入中出现的第1个空格认为是AB的分隔。题目保证至少存在一个空格,并且B不是一个空字符串。

    输出格式:

    如果输入的确是两个正整数,则按格式A + B = 和输出。如果某个输入不合要求,则在相应位置输出?,显然此时和也是?

    输入样例1:

    123 456

    输出样例1:

    123 + 456 = 579

    输入样例2:

    22. 18

    输出样例2:

    ? + 18 = ?

    输入样例3:

    -100 blabla bla...33

    输出样例3:

    ? + ? = ?

    ------------------------------------------------L1-025----------------------------------------------------------

     注解:这道题WA了我很久,直到某节英语课突然通关哈哈哈哈哈,这道题要注意很多东西:

    ①A和B同时输入,识别为负数则要输出问号

    ②A和B输入的大小不超过1000,否则要输出问号

    ③A可以为空,B不为空

    ④要处理A+B的结果,即要把字符串转为整型

    ⑤识别数字,如果乱码得输出为问号。

    · 代码分块:

      第一步:构建结构体存储A和B的内容及转码int值还有是否合法:

    struct T{
        char temp[9999999];
        int is_empty = 0;
        int ans = 0;
    }temp_1,temp_2;

      第二步:对结构体进行审核处理,构建特殊函数对结构体处理:

      这里要注意:千万不能提前把0吃了,因为可能会出现04 08这样的情况,这样是符合题目条件的,输出4+8=12,因为得从sum加和结果判断是否为0,而不是凭输入。

    void TempToAns(struct T &t)
    {
        int i = 0;
        t.ans = 0;
        base = 1;
        if(t.temp[0] == 45) t.is_empty = 1,i = 1;
        if(t.temp[0] == 32 ) t.is_empty = 1, i = 1;
        for(int j = strlen(t.temp)-1;j>=i;j--)
        {
            if(('0'<= t.temp[j]) && (t.temp[j] <= '9'))
            {
                t.ans+=base*(t.temp[j] - 48);
                base*=10;
            }
            else 
            {
                t.is_empty = 1;
                break;
            }
        }
        if(t.ans > 1000 || t.ans <=0) t.is_empty = 1;
    }

      第三步:将一个大数组进行临时存储所有字符,然后循环扫第一个空格,这里千万不能拆成两个输入,不然A无法获取为空值,就会过不了其中一个测试点。

        char temp[999999];
        int up;
        int have = 0;
        cin.getline(temp,999999);
        for(int i = 0;;i++) 
        {
            if(temp[i] == ' ' && have == 0)
            {
                up = i;
                have = 1;
                continue;
            }
            if(i>=strlen(temp)) break;
            if(have == 0) temp_1.temp[i] = temp[i];
            else temp_2.temp[i-up-1] = temp[i];
        }

      第四步,调用结构体处理函数:

        TempToAns(temp_1);
        TempToAns(temp_2);

      第五步:进行输出,通过判断temp_1(或temp_2).is_empty是否为1来判断是否输出?

        if(temp_1.is_empty == 1) printf("?");
        else 
        {
            if(temp_1.ans == 0) 
            {
                temp_1.is_empty = 1;
                printf("?");
            }
            else printf("%d",temp_1.ans);
        }
        printf(" + ");
        if(temp_2.is_empty == 1) printf("?");
        else printf("%d",temp_2.ans);
        printf(" = ");
        if(temp_1.is_empty == 0 && temp_2.is_empty == 0) printf("%d
    ",temp_1.ans+temp_2.ans);
        else printf("?
    ");

    · AC代码:

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<cstring>
    using namespace std;
    
    struct T{
        char temp[9999999];
        int is_empty = 0;
        int ans = 0;
    }temp_1,temp_2;
    
    char temp;
    int base;
    void TempToAns(struct T &t)
    {
        int i = 0;
        t.ans = 0;
        base = 1;
        if(t.temp[0] == 45) t.is_empty = 1,i = 1;
        if(t.temp[0] == 32 ) t.is_empty = 1, i = 1;
        for(int j = strlen(t.temp)-1;j>=i;j--)
        {
            if(('0'<= t.temp[j]) && (t.temp[j] <= '9'))
            {
                t.ans+=base*(t.temp[j] - 48);
                base*=10;
            }
            else 
            {
                t.is_empty = 1;
                break;
            }
        }
        if(t.ans > 1000 || t.ans <=0) t.is_empty = 1;
    }
    
    int main()
    {
        char temp[999999];
        int up;
        int have = 0;
        cin.getline(temp,999999);
        for(int i = 0;;i++) 
        {
            if(temp[i] == ' ' && have == 0)
            {
                up = i;
                have = 1;
                continue;
            }
            if(i>=strlen(temp)) break;
            if(have == 0) temp_1.temp[i] = temp[i];
            else temp_2.temp[i-up-1] = temp[i];
        }
        TempToAns(temp_1);
        TempToAns(temp_2);
        if(temp_1.is_empty == 1) printf("?");
        else 
        {
            if(temp_1.ans == 0) 
            {
                temp_1.is_empty = 1;
                printf("?");
            }
            else printf("%d",temp_1.ans);
        }
        printf(" + ");
        if(temp_2.is_empty == 1) printf("?");
        else printf("%d",temp_2.ans);
        printf(" = ");
        if(temp_1.is_empty == 0 && temp_2.is_empty == 0) printf("%d
    ",temp_1.ans+temp_2.ans);
        else printf("?
    ");
        return 0;
     } 

    ------------------------------------------------L1-026----------------------------------------------------------

     I Love GPLT

    这道超级简单的题目没有任何输入。

    你只需要把这句很重要的话 —— “I Love GPLT”——竖着输出就可以了。

    所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车。

    输入样例:

    输出样例:

    I
    
    L
    o
    v
    e
    
    G
    P
    L
    T

    注意:输出的两个空行中各有一个空格。

    ------------------------------------------------L1-026----------------------------------------------------------

    注解 :水题,不知道意义在哪

    #include<stdio.h>
    #include<string.h>
    
    char N[]={"I Love GPLT"};
    
    int main()
    {
        for(int i = 0;i<11;i++) 
            printf("%c
    ",N[i]);
        return 0;
     }     

    注:如果有更好的解法,真心希望您能够评论留言贴上您的代码呢~互相帮助互相鼓励才能成长鸭~~

  • 相关阅读:
    tar命令,vi编辑器
    Linux命令、权限
    Color Transfer between Images code实现
    利用Eclipse使用Java OpenCV(Using OpenCV Java with Eclipse)
    Matrix Factorization SVD 矩阵分解
    ZOJ Problem Set
    Machine Learning
    ZOJ Problem Set
    ZOJ Problem Set
    ZOJ Problem Set
  • 原文地址:https://www.cnblogs.com/winniy/p/10514044.html
Copyright © 2011-2022 走看看