PTA L1-025 正整数A+B(详解)

这篇具有很好参考价值的文章主要介绍了PTA L1-025 正整数A+B(详解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:本期是关于正整数A+B的详解,内容包括四大模块:题目,代码实现,大致思路,代码解读,今天你c了吗?

PTA 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:

? + ? = ?

代码实现: 

#include<stdio.h>
#include<string.h>
int is_integer(char ptr[])
{
    int len = strlen(ptr);
    int ret = 0;
    if (len > 4)
    {
        return -1;
    }
    else
    {
        int i = 0;
        for (i = 0; i < len; i++)
        {
            if (ptr[i] >= '0' && ptr[i] <= '9')
            {
                ret = ret * 10 + (ptr[i] - '0');
            }
            else
            {
                return -1;
            }
        }
    }
    if (ret < 1 || ret>1000)
    {
        return -1;
    }
    else
    {
        return ret;
    }
}
int main()
{
    char arr[100] = { 0 };
    char str[100] = { 0 };
    scanf("%s ", arr);
    gets(str);
    int a = is_integer(arr);
    int b = is_integer(str);
    if (a == -1 && b == -1)
    {
        printf("? + ? = ?");
    }
    else if (a == -1 && b != -1)
    {
        printf("? + %d = ?", b);
    }
    else if (a != -1 && b == -1)
    {
        printf("%d + ? = ?", a);
    }
    else if (a != -1 && b != -1)
    {
        printf("%d + %d = %d", a, b, a + b);
    }
    return 0;
}

大致思路: 

1. 存储问题:输入的可能为数字or一串字符,故而我们使用字符数组存储输入的值

    这样原本的数字变成了数字字符

2. 输入问题:我们会输入A 空格 B,采用scanf与gets结合

                      不能使用scanf一次读取A和B

                       不能使用gets一次读取A和B

           原因:

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

即:A是可以被完整读取的,B可以被完整读取or不完整读取(可能存在多个空格)

输入存在多个空格的情况:

123 456 sask

A的内容:123

B的内容:456 sask

若是使用scanf一次读取A和B:可能会写出如下代码

  scanf("%s%s", arr, str);

调试可以看到123是完整读取的,456 sask则是不完整读取的

PTA L1-025 正整数A+B(详解) 不完整读取的会导致打印结果出错

会打印出错误结果:123 + 456 = 579

而不是正确结果:     123 + ? = ?

因为scanf默认遇到空格读取结束,123可以被完整读取,而在读取456 sask时,scanf只会读走空格之前的456

若是使用gets一次读取A和B:可能会写出如下代码

    gets(arr);
    gets(str);

调试可以看到输入的内容全部被存入了arr数组中,str数组是空的

PTA L1-025 正整数A+B(详解)因为gets的作用是读取一串字符,可以一并读取一串字符中的空格,直到遇到\n或到达EOF才会停止 ,所以第一个gets函数就一直读取,直到遇到\n

采用scanf与gets结合:

    scanf("%s ", arr);
    gets(str);

scanf负责读取123 空格(A的内容+视作AB的分隔的第一个空格)

gets负责读取456 sask 

注意:scanf一定也要把第一个空格(第1个空格认为是AB的分隔)读走(不会将空格存入arr数组中),否则gets会读取第一个空格和B的内容然后存入str数组(原本只存入B的内容)中,导致结果错误

3. 输出问题:存在四种情况

情况一:输出 ? + ? = ?

情况二:输出 ? + %d = ?

情况三:输出 %d + ? = ?

情况四:输出%d + %d = %d

代码解读

part 1 :判断是否为正整数的函数实现

int is_integer(char ptr[])
{
    int len = strlen(ptr);
    int ret = 0;
    if (len > 4)
    {
        return -1;
    }
    else
    {
        int i = 0;
        for (i = 0; i < len; i++)
        {
            if (ptr[i] >= '0' && ptr[i] <= '9')
            {
                ret = ret * 10 + (ptr[i] - '0');
            }
            else
            {
                return -1;
            }
        }
    }
    if (ret < 1 || ret>1000)
    {
        return -1;
    }
    else
    {
        return ret;
    }
}

返回-1:输入的不是正整数

返回相应的数字:是正整数(由数组中的数字字符转化相加构成) 

此函数判断若数组中所存储的一个个字符是数字字符,则返回它们组成起来能构成的数字

字符转成数字:字符-'0'=数字

因为一个个数字字符组合在一起能够构成的数字不会是-1(题目要求:正整数才是唯一正确合法的输入)

1. 首先判断字符串的长度:长度>4不合法,因为AB都在区间[1,1000],最长是4位

   int len = strlen(ptr);
   if (len > 4)
    {
        return -1;
    }

2. 若是长度合法,再来遍历数组中的每一个字符

    else
    {
        int i = 0;
        for (i = 0; i < len; i++)
        {
            if (ptr[i] >= '0' && ptr[i] <= '9')
            {
                ret = ret * 10 + (ptr[i] - '0');
            }
            else
            {
                return -1;
            }
        }
    }

若是字符是数字字符,则返回其能构成的数字,代码如下:

ret = ret * 10 + (ptr[i] - '0');

如 '1‘ '2’ '3' 所对应的就是数字123

转换:前一个字符所代表的数字*10+(当前字符-'0')=现在的数字

     如:123怎么能够由1,2,3组成呢?

       step1:   0*10+1=1

           step2:    1*10+2=12

                step3:    12*10+3=123

   ret初始化为数字0,step1:ret*10+1(由字符1转换:'1'-'0')=1

                                   step2:   ret(存储的是step中的数字1)*10+2(由字符2转换)=12

                                   step3:ret(存储的是step2中的数字12)*10+3(由字符3转换)=123

                    

若是字符不是数字字符,则返回-1 

            else
            {
                return -1;
            }

3. 判断ret中存储的由一系列数字字符构成的数字是否在[1,1000]之间

    if (ret < 1 || ret>1000)
    {
        return -1;
    }
    else
    {
        return ret;
    }

此时ret中的数字是1~4位,现在要判断的是其数值有没有小于1或者大于100

若是数值不合理则返回-1(表明数值为非正整数)

若是数值合理则返回数值 (一定不是-1)

 part 2 总体框架


    char arr[100] = { 0 };
    char str[100] = { 0 };
    scanf("%s ", arr);
    gets(str);
    int a = is_integer(arr);
    int b = is_integer(str);
    if (a == -1 && b == -1)
    {
        printf("? + ? = ?");
    }
    else if (a == -1 && b != -1)
    {
        printf("? + %d = ?", b);
    }
    else if (a != -1 && b == -1)
    {
        printf("%d + ? = ?", a);
    }
    else if (a != -1 && b != -1)
    {
        printf("%d + %d = %d", a, b, a + b);
    }

读取A和B的内容,分别存储到arr数组和str数组

a和b:接收函数的返回结果 

若是返回结果的值是-1:不是正整数

若返回结果的值不是-1:是正整数文章来源地址https://www.toymoban.com/news/detail-420420.html

到了这里,关于PTA L1-025 正整数A+B(详解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【PTA】L1-039 古风排版(C++)

    题目链接:L1-039 古风排版 - 团体程序设计天梯赛-练习集 (pintia.cn)  目录: 题目要求: 输入格式: 输出格式: 输入样例: 输出样例: 思路: 代码: 测试结果: ​编辑  中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。 输入在第

    2024年03月26日
    浏览(96)
  • PTA L1-095 分寝室 (20 分)

    学校新建了宿舍楼,共有 n n n 间寝室。等待分配的学生中,有女生 n 0 n_0 n 0 ​ ​ 位、男生 n 1 n_1 n 1 ​ ​位。所有待分配的学生都必须分到一间寝室。所有的寝室都要分出去,最后不能有寝室留空。 现请你写程序完成寝室的自动分配。分配规则如下: 男女生不能混住; 不

    2023年04月23日
    浏览(37)
  • 【PTA】L1-059 敲笨钟(C++)

    题目链接:L1-059 敲笨钟 - 团体程序设计天梯赛-练习集 (pintia.cn)  题目要求:  输入格式: 输出格式: 输入样例: 输出样例: 思路:  代码: 测试结果: 微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性,还会糟改几句古

    2024年04月11日
    浏览(75)
  • 【PTA】L1-043 阅览室(C++)

    题目链接:L1-043 阅览室 - 团体程序设计天梯赛-练习集 (pintia.cn)  目录: 题目要求: 输入格式: 输出格式: 输入样例: 输出样例:  思路: 代码:; 测试结果: 天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下 S 键,程序开始

    2024年04月15日
    浏览(84)
  • PTA——L1-023 输出GPLT(c语言)

    给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按 GPLTGPLT.... 这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按 GPLT 的顺序打印,直到所有字符都被输

    2024年02月13日
    浏览(37)
  • 2023 PTA天梯赛补题(L1 & L2)

    输入输出题 输入输出题 k == n 和 k == m 分别输出,题目怎么说就怎么做 判断一下c 等于a + b还是a*b或者都不是,分别按要求输出 针对每一群玩游戏的宝宝,枚举判断一下就好了 写的有点烦,基本就是一步一步模拟,思路在注释里写了 枚举分配方案,代码中a代表女生寝室的数

    2024年02月03日
    浏览(41)
  • PTA L1-048 矩阵A乘以B

    前言:内容包括四大模块:题目,代码实现,大致思路,代码解读 给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有Ra​行、Ca​列,B有Rb​行、Cb​列,则只有Ca​与Rb​相等时,两个矩阵才能相乘。 输入格式: 输入

    2024年02月04日
    浏览(36)
  • pta模拟赛 L1-8 小偷踩点(C++)

    阅读理解太难了  俗话说不怕贼偷,就怕贼惦记。 小偷在作案前有时会在居民家的门、墙上做一些标记,每一种记号代表一个含义,一般人看不懂,但同行一看便知道这个家庭的情况。不过派出所干警也不是吃素的,很快破译了这些记号的含义(如上图),并且在辖区内广为

    2024年04月26日
    浏览(102)
  • PTA L1-048 矩阵A乘以B C语言

    输入样例1: 输出样例1: 输入样例2: 输出样例2: 也就是: 第一个矩阵第一行的每个值与第二个矩阵第一列的每个值对应相乘后加和起来,就得到了乘积矩阵的第一行的第一个值 第一个矩阵第一行的每个值与第二个矩阵第二列的每个值对应相乘后加和起来,就得到了乘积矩

    2024年02月03日
    浏览(49)
  • 【2023团体程序设计天梯赛CCCC】GPLT2023,L1~L2部分(PTA,L1-089~L1-096,L2-045~L2-048)题解代码&复盘

    概要 L1部分:L1-089~L1-096 L2部分:L2-045~L2-048 L3部分:L3-033~L3-036 L1-089 最好的文档 5 L1-090 什么是机器学习 5 L1-091 程序员买包子 10 L1-092 进化论 10 L1-093 猜帽子游戏 15 L1-094 剪切粘贴 15 L1-095 分寝室 20 L1-096 谁管谁叫爹 20 L2-045 堆宝塔 25 L2-046 天梯赛的赛场安排 L2-047 锦标赛 25 L2-048

    2024年02月01日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包