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:

? + ? = ?

 

思路:

    自定义一个函数判断字符串是否为[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;
}

 

 

posted @ 2019-02-11 15:00  小泰格儿  阅读(739)  评论(0编辑  收藏  举报