欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

L1-025 正整数A+B

程序员文章站 2022-12-16 19:17:33
题目: 题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。 输入格式: 输入在一行给出A和B,其间以空格分开。问题是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:

? + ? = ?

 

思路:

    自定义一个函数判断字符串是否为[1,1000]间的整数。用getline接收一行的字符串,再根据第一个空格使用substr进行划分两个字符串。分别调用函数判断这俩字符串是否符合要求,后面的比较好写。

知识点for me:

1、不能像这样输出字符串:printf("%s + %s = %s",s1,s2,res);因为printf只能输出c语言内置的数据,而string不是内置的。如果要用printf输出字符串应该加一个.c_str(),比如printf("%s\n", s.c_str());。

2、在用c++的string时也不能使用scanf读取输入。如果一定要用scanf读取的话要这么做:char str[10];  scanf("%s",str); 注意这里没有加&,因为在c语言中数组名就代表该数组的起始地址。涉及到string的输入输出时干脆还是全部用cin,cout或者是getline(cin,str) 读取一行字符串。

3、stoi()可以将string转换成int,stod()可以将string转换成double;to_string()可以将int、double、float等类型的变量转换成string。它们的头文件都是#include <string>。这都是c++11的特性。

 

上代码:

#include <cctype>
#include <string>
#include <iostream>
using namespace std;
bool islegal(string s)
{
    for(int i=0;i<s.length();i++)
    {
        if(!isdigit(s[i]))
            return false;
    }
    if(1<=stoi(s)&&1000>=stoi(s)){
        return true;
    }else{
        return false;
    }
}
int main()
{
   string s,s1,s2,res;
   getline(cin, s);
   for(int i=0;i<s.length();i++)
   {
           if(s[i]==' '){
               s1=s.substr(0,i);
               s2=s.substr(i+1);
               break;
           }
   }
   if(!islegal(s1))
   {
           s1="?";
           res="?";
   }          
   if(!islegal(s2))
   {
           s2="?";
        res="?";       
   }
   if(islegal(s1)&&islegal(s2)){
         res=to_string(stoi(s1)+stoi(s2));
   }        
   cout<<s1<<" + "<<s2<<" = "<<res;    
   return 0;
}