返回顶部

『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\n",temp_1.ans+temp_2.ans);
    else printf("?\n");

· 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\n",temp_1.ans+temp_2.ans);
    else printf("?\n");
    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",N[i]);
    return 0;
 }     

 

 

 

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

posted @ 2019-03-11 23:38  HiCoding、嗨威  阅读(396)  评论(0编辑  收藏  举报