【PTA】L1-025 正整数A+B (C++)

题目链接:L1-025 正整数A+B

目录:

题目要求:

输入格式:

输出格式:

输入样例1:

输出样例1:

输入样例2:

输出样例2:

输入样例3:

输出样例3:

思路:

代码:

测试结果:


题目要求:

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

? + ? = ?

思路:

1.字符串形式输入俩个字符串

2.写一个函数用来判断字符串是否符合题目要求

(1)范围在0~1000,一种判断条件是输入字符串的长度不得超过4,另一种判断的条件是sum不能超过1000

(2)判断每个字符是否在0~9之内,如果有一个不在都不满足要求,如果都满足条件则将字符串转化为数字

3.进行不同条件的判断来输出不同情况下的结果

主要功能是检查用户输入的两个字符串是否都是合法的四位数以内的整数,并相应地执行加法运算或打印出带问号的表达式。

让我们逐步分析代码:

头文件和命名空间:这包括了几乎所有的标准库,并使用了 std 命名空间。

#include <bits/stdc++.h>  
using namespace std;

主函数:这是程序的入口点。

int main()
 
{
 
       ....
 
}

is_integer 函数:

  • 这个函数接受一个字符数组 ptr 作为参数,该数组应该包含一个字符串。
int is_integer(char ptr[])
  • 函数首先计算字符串的长度 len
 int len = strlen(ptr);
  • 如果字符串长度大于4,则函数返回 -1,因为题目要求只处理四位数以内的整数。
if (len > 4)
{
    return -1;
}
  • 接下来,函数通过遍历字符串中的每个字符来检查是否所有字符都是数字。
for (i = 0; i < len; i++)
{
    if (ptr[i] >= '0' && ptr[i] <= '9')
    
}
  • 如果遇到非数字字符,函数返回 -1
return -1;
  • 如果所有字符都是数字,函数将字符串转换为一个整数 ret
 ret = ret * 10 + (ptr[i] - '0');
  • 最后,如果转换后的整数不在 1 到 1000 的范围内,函数也返回 -1
if (ret < 1 || ret > 1000)
{
    return -1;
}
  • 否则,函数返回转换后的整数。
else
{
    return ret;
}
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;
    }
}

main函数:

  • 定义了两个字符数组arrstr来存储用户输入。
char arr[100] = { 0 };
char str[100] = { 0 };
  • 使用scanf()读取第一个字符串。但这里有一个问题:scanf()会在遇到空格、制表符或换行符时停止读取,这意味着如果用户输入了一个带空格的字符串,scanf()只会读取空格之前的部分。
scanf("%s ", arr);
  • 使用不安全的gets()函数读取第二个字符串。
gets(str);
  • 调用is_integer()函数检查两个字符串是否都是整数,并据此输出不同的加法表达式。
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);
}

结束程序:主函数返回0,表示程序正常结束。

return 0;  

代码:

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

测试结果:

在这里插入图片描述

感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:

① 2000多本Python电子书(主流和经典的书籍应该都有了)

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 28
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值