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

news2024/11/17 20:19:48

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

题目: 

 

题的目标很简单,就是求两个正整数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则是不完整读取的

 不完整读取的会导致打印结果出错

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

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

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

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

    gets(arr);
    gets(str);

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

因为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:是正整数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/192364.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用户使用苹果AirTag来追踪宠物存在风险,苹果Find My功能用处广

苹果的 AirTag 不失为追踪宠物的一种便捷方式&#xff0c;这样宠物即便挣脱宠物圈或者其它方式丢失&#xff0c;都可以通过“Find My”方式追踪定位。正如《华尔街日报》所指出的&#xff0c;这种方式也存在 AirTag 被宠物吞食的风险。 AirTag 的直径为 1.26 英寸&#xff0c…

【Faster R-CNN】之 Resize_and_Padding 代码精读

【Faster R-CNN】之 Resize_and_Padding1、前言&#xff1a;2、resize_image_and_bbox1&#xff09;先对图像做resize处理2&#xff09;再对 bounding box 做resize处理3、padding_images代码1、前言&#xff1a; 在上一篇文章 【Faster R-CNN】之 Dataset and Dataloader 代码…

Linux网络:传输层之UDPTCP协议

文章目录一、端口号1.端口号范围划分2.常用命令二、UDP 协议1.格式2.特点3. UDP 的缓冲区4. UDP 使用注意事项5.基于 UDP 的应用层协议三、TCP 协议1.格式2.确认应答机制3.超时重传机制4.连接管理机制三次握手四次挥手5.滑动窗口6.流量控制7.拥塞控制8.延迟应答9.捎带应答10.面…

PyQt5利用Qt Designer制作一个可以拖动获取文件信息的页面

前言 本篇在讲什么 用pyqt5制作一个简单的程序&#xff0c;拖动文件或脚本可以读取文件信息 本篇适合什么 适合初学PyQt5的小白 本篇需要什么 对Python语法有简单认知 对Qt有简单认知 依赖Pycharm编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&…

[Golang实战]整理Golang忽略的问题

整理Golang忽略的问题参考资料1.WaitGroup与GoRoutine的竞速2.Mutex互斥锁和RWMutex互斥读写锁3.poll,select,epoll4.何时栈和堆?5.GoRoutine合理使用6.GoRoutine优雅退出6.1data channel关闭通知退出6.2exit channel关闭通知退出6.3context超时或取消通知退出6.4WaitGroup/Er…

IPWorks EDI 2022.0.8381 for NET Crack

IPWorks EDI基于用于安全 EDI 通信&#xff08;AS2、SFTP、OFTP、RosettaNet、MLLP 等&#xff09;的领先 EDI-INT 协议&#xff0c;IPWorks EDI 库包含促进安全 EDI 消息传递以及 EDI 映射、翻译和验证&#xff08;X12、 EDIFACT、HL7、TRADACOMS、VDA、XML 和 JSON&#xff0…

golang/安装

golang中文官网 https://golang.google.cn/ golang下载 安装 一路next 配置 配置值说明GOROOTD:\ProgramFiles\golanggolang安装目录PATHD:\ProgramFiles\golang\bingolang命令路径GO111MODULEon开启go.mod功能&#xff0c;go.mod是go官方依赖包管理工具GOPROXYhttps://go…

【FPGA笔记系列7】时序逻辑电路基础D触发器

时序逻辑电路 组合逻辑与时序逻辑电路的本质区别:时序逻辑电路的输出和前一时刻的状态有关,组合逻辑电路的输出只和当前的输入有关 与非门RS锁存器的缺陷:当SR从00变到11时,状态不稳定! 电路中小圈圈表示低电平有效! 透明锁存器 R=1当En=1时,Q=S当En=0时,后面为RS触发器…

使用git合并两个不同项目代码

使用git合并两个不同项目代码 前言, 这里解决的是两个不同的项目, 因为不同项目那必然是两个不同的git仓库 都是不同的git仓库了那就更不可能是相同的分支了(即使分支名相同) 至于为什么会有这种业务情况出现, 我也不知道, 反正先学干就完了 这里图形化界面演示用的是idea自带的…

人工智能时代八大类算法你了解吗?(包邮送书6本)

文章目录本文导读1. 关联规则分析2. 回归分析3. 分类分析4. 聚类分析5. 集成学习6. 自然语言处理7. 图像处理8. 深度学习9. 书籍推荐&#xff08;包邮送书6本&#xff09;本文导读 从零带你了解人工智能时代需要掌握的8大类算法&#xff0c;包括基础理论、关联规则分析、回归分…

Java-基础-4.IO流

一&#xff1a;为什么有IO流&#xff1f; 在显示生产中&#xff0c;我们的数据&#xff0c;都是不停的往过输入和输出&#xff0c;我们将这种模式称作为流。并且在输入和输出的过程中&#xff0c;我们包装了一些其他类。 二&#xff1a;什么是IO流&#xff1f; 1. 按照数据处理…

Linux学习之常用基本命令【1】

文章目录前言一 Linux系统简介二 补充知识Unix和Minix三 开关机命令四 系统目录结构五 树形显示文件目录结构六 目录管理6.0 目录操作常用命令6.1 ls(列出目录)【常用命令】6.2 cd(切换目录)6.3 pwd( 显示当前所在的目录 )6.4 mkdir&#xff08;make directory创建目录&#xf…

Power BI折线图

如果要展现数据的趋势变化&#xff0c;折线图应该是不二之选&#xff0c;并且它更擅长于展现时间序列下的数据&#xff0c;根据折线斜率的不同展现变化的速率。 本文使用PowerBI Desktop来轻松生成一个折线图。 案例数据&#xff1a;2006-2015年各省市的三个产业的产值&#…

【SAP Abap】X档案:SAP 快速提供基础数据给第三方系统访问的几种方法

SAP 快速提供基础数据给第三方系统访问的几种方法1、数据封装2、开放RFC访问3、开放接口服务4、开放DB访问1、数据封装 在企业信息系统建设过程中&#xff0c;少不了的就是系统集成数据对接。 尤其是SAP系统中大量的基础数据集成&#xff0c;如各种字段值域&#xff0c;需要提…

Vue2笔记02 表单数据,过滤器,常见指令,生命周期,组件

表单数据 过滤器 过滤器&#xff1a;将数据进行简单处理后再使用 好用的第三方库的网站&#xff1a;BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务 显示当前时间计算属性的写法 过滤器的写法 多个过滤器可以串联 &#x1f446;这里的过滤器是局部过滤器&#xff0c…

day03_java基本语法

今日内容 零、复习昨日 一、开发工具 二、Eclipse使用 三、程序解读 四、输出语句 五、常量 六、变量 七、数据类型 零、 复习昨日 见晨考.txt 一、开发工具 开发工具: Eclipse(免费),IDEA(收费) 1.1 Eclipse安装 Eclipse是绿色安全的,直接解压即可使用 1.2 启动Eclipse ps:…

原型和原型链

什么是原型&#xff1f; 因为每一个函数都有一个属性&#xff0c;这个属性名就是prototype,&#xff08;即为显式原型&#xff09; 这个属性的值是一个对象 每一个实例对象都有一个__proto__&#xff08;即为隐式原型&#xff09; 原型就是函数的prototype属性&#xff0c;…

excel数据比较:如何做一个完美的多条件排名方案

排名&#xff0c;简单&#xff1b;但如果有多个项目类别&#xff0c;并且可能存在业绩相同&#xff0c;怎么快速找出各个分享排名第一的人物呢&#xff1f;这就要通过多条件去匹配&#xff0c;才能找出需要的排名第一者。这里提供了两个方案&#xff0c;但都不够完美&#xff0…

Unity-TCP-网络聊天功能(三): 公共/私人聊天、添加好友、好友上下线、新消息提醒、点击好友聊天、退出登录

7.多人公共聊天、私人聊天、添加好友、好友上下线、新消息提醒、点击好友开始聊天、退出登录搭建好ChatView的UI和ChatItem编写Unity-Scripts/View/ChatView.cs脚本&#xff0c;加入了私人聊天和公共聊天逻辑&#xff0c;chatView界面处理接收&#xff08;ChatHandle委托&#…

在 Linux 中创建用户 and 给用户设置密码相关操作

目录 一、创建用户 二、给用户设置密码相关操作 ②.①、修改用户密码 ②.②、设置用户密码 ②.③、删除用户密码 一、创建用户 语法&#xff1a; useradd [-g 用户组名 -d home目录] 用户名 在 Linux 中“[]”里面的内容都代表可选&#xff0c;可以不写。 useradd&…