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

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

  • 相关阅读:
    usaco contest
    chapter 2.getting started
    几种常见排序
    [usaco]Programming Contest Problem Types
    回溯实现组合问题
    第二章:循环结构程序设计
    第一章:程序设计入门
    第三章:数组和字符串
    数据库设计(一对一、一对多、多对多)
    linux与windows回车换行符的区别
  • 原文地址:https://www.cnblogs.com/winniy/p/10514044.html
Copyright © 2011-2022 走看看