L1-025 正整数A+B(水题)+scanf(“%[^ ]”)的应用
知识点:
用scanf输入带有空格的字符串
“%[]”格式可以用 ^+任意字符来结束字符串的输入
#include <bits/stdc++.h>
using namespace std;
int main(){
char str[100];
scanf("%[^\n]",str);
//直到读入回车键,读取才结束
//(可以有效替代gets,解决gets无法编译通过的问题)
printf("%s\n",str);
}
getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab)
按题目要求,两个字符串之间以一个空格想隔开,所以用getchar()把该空格从输入缓冲区读走,从而不影响第二个字符串
蒟蒻自己:
校内团队赛选拔的时候这个死活只过了三个测试点,怎么改都没过,后面发现自己想多了,记录一下自己的傻x时刻
题面
题的目标很简单,就是求两个正整数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:
? + ? = ?
代码
注意:
123 3 4
这种情况输出结果仍为123 + ? = ?
哪怕都为正整数,也要注意范围(1<=x<=1000)
#include <bits/stdc++.h>
using namespace std;
int main(){
char s1[1000],s2[1000];
int sum1=0,sum2=0;
int len1,len2;
bool flag1=true,flag2=true;
scanf("%s",s1);
len1 = strlen(s1);
for(int i=0;i<len1;++i){
if(s1[i]>'9'||s1[i]<'0')
flag1=false;
}
if(flag1){
for(int i=0;i<len1;++i){
sum1 = sum1*10+s1[i]-'0';
}
}
getchar();
//从输入缓冲区中把题目要求的空格给读取走
//减免判断s2[0]是否为空格的操作。
scanf("%[^\n]",s2);
len2 = strlen(s2);
for(int i=0;i<len2;++i){
if(s2[i]>'9'||s2[i]<'0')
flag2=false;
}
if(flag2){
for(int i=0;i<len2;++i){
sum2 = sum2*10+s2[i]-'0';
}
}
if(flag1&&sum1>=1&&sum1<=1000)
cout<<sum1<<" + ";
else
cout<<"? + ";
if(flag2&&sum2>=1&&sum2<=1000)
cout<<sum2<<" = ";
else
cout<<"? = ";
if(flag1&&sum1>=1&&sum1<=1000 && flag2&&sum2>=1&&sum2<=1000)
cout<<sum1+sum2;
else
cout<<"?";
}