L1-025 正整数A+B
题目:
题的目标很简单,就是求两个正整数a
和b
的和,其中a
和b
都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。
输入格式:
输入在一行给出a
和b
,其间以空格分开。问题是a
和b
不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。注意:我们把输入中出现的第1个空格认为是a
和b
的分隔。题目保证至少存在一个空格,并且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; }
下一篇: 设计模式:备忘录模式
推荐阅读
-
PHP算法:如何把 00301.0050600变成正整数30100506
-
1002 A+B for Polynomials (25 point(s))
-
c语言:不使用(a+b)/2这种方式,求两个数的平均值。
-
数据结构笔记12:在含n个整数的数组中找未出现的最小正整数
-
PHP算法:如何把 00301.0050600变成正整数30100506
-
如上图所示,由正整数1,2,3……组成了一颗二叉树。我们已知这个二叉树的最后一个结点是n。现在的问题是,结点m所在的子树中一共包括多少个结点。
-
CODE[VS]题号:1000 A+B问题
-
JavaScript正则表达式校验非正整数实例
-
递归(二):正整数的拆分
-
java判断字符串是正整数的实例