@[始]正整数A+B
作者 | 陈越 |
---|---|
内存限制 | 64 MB |
单位 | 浙江大学 |
时间限制 | 400 ms |
代码长度限制 | 16 KB |
题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。但是有一点坑的就是 例如 123 456 ad 输出结果应该是 123+?= ?,而不是123+456=579。
输入格式:
输入在一行给出 A 和 B ,其间以空格分开。问题是 A 和 B 不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。
注意:我们把输入中出现的第1个空格认为是 A 和 B 的分隔。题目保证至少存在一个空格,并且 B 不是一个空字符串。
输出格式:
如果输入的确是两个正整数,则按格式 A + B = 和 输出。如果某个输入不合要求,则在相应位置输出 ? ,显然此时和也是 ? 。
输入样例1:
123 456
输出样例1:
123 + 456 = 579
输入样例2:
- 18
输出样例2:
? + 18 = ?
输入样例3:
-100 blabla bla…33
输出样例3:
? + ? = ?
以下是代码:
/* by --zjy */
#include<bits/stdc++.h> // C++万能头文件
using namespace std;
int main()
{
string s,t; // 定义字符串型
int flaga=1,flagb=1,count=0;
int a=0,b=0;
char c;
cin >> s >> t;
c=getchar();
/* 这道题主要是这部分,例如123 456 ad 输出结果应该是 123+?= ?
所以最后再输入一个字符判断是否是换行*/
for(int i=0;i<s.size();i++){
a=10*a+s[i]-'0';
if(isdigit(s[i]))
count++;
if(count==s.size())
flaga=0;
} // 把字符串录入整型a中,并判断每个位是否是数字
count=0;
for(int i=0;i<t.size();i++){
b=10*b+t[i]-'0';
if(isdigit(t[i]))
count++;
if(count==t.size())
flagb=0;
}
if(c!='\n')
flagb=1;
if(a<=0 || a>1000) flaga=1;
if(b<=0 || b>1000) flagb=1;
if(flaga==0) printf("%d",a);
else printf("?");
printf(" + ");
if(flagb==0) printf("%d",b);
else printf("?");
printf(" = ");
if(flaga==0 && flagb==0) printf("%d",a+b);
else printf("?");
return 0;
}
这个方法其实很一般,大多数都能够想到,我朋友提供一种更简单的方法。
#include<stdio.h>
int main(void){
char str_a[100] = {0}, str_b[100] = {0}, str[100] = {0};
int a = 0,b = 0;
scanf("%s%[^\n]", str_a, str_b); //由样例3可知第一个空格之后的字符串(包括空格)都为B串
/* 这里用了正则表达式更好的处理了我所说的问题。不明白正则的可以去看一下[正则表达式](http://www.runoob.com/regexp/regexp-syntax.html) */
sscanf(str_a,"%d%s", &a, str); //使用sscanf处理字符串,取串中整数。剩下的部分给str
if(a <= 1000 && a >= 1 && str[0] == '\0')//当整数部分符合区间,且str为空时输出
printf("%d + ", a); //当str_a符合时
else{
printf("? + "); //当str_a不符合时
a = 0; //将a置零,储存str_a不符合整数的信息
str[0] = '\0'; //将str[0]置零,防止对str_b进行sscanf取数值后为空时,str却不为空
}//else end
sscanf(str_b,"%d%s", &b, str); //同str_a
if(b <= 1000 && b >= 1 && str[0] == '\0'){
if(a) //当str_a符合,且str_b符合时
printf("%d = %d", b, a+b);
else //当str_a不符合,且str_b符合时
printf("%d = ?", b);
}//if end
else //当str_b符合时
printf("? = ?");
return 0;
}//main end
这种方法更高效,而且代码更简洁,如果你有更好的方法,欢迎在下方留言。我们共同进步!希望大家关注我,谢谢。