题目大意:给出一个区间以及一个字符串,判断字符串是否为整数且在该区间内。
解题思路:这个题真的醉了,做比赛的时候拍了一个版本交了WA,看到过题率那么低,以为是细节没读到,再去分析题,发现可能是不是含有空格要过滤掉,结果弄了整个比赛都是WA,后来看题解才发现自己傻了。然后弄了一晚上,换了各种版本的写法都是WA,不知道挂死在哪一个数据上了。测试了所有能想到的数据,还对拍了别人的code,居然还是过不了,真的受不了。不过看到大神些写了一个转换为字符串的处理版本,感觉很神奇的,看来下来还是要好好学习下字符串的处理了。这里有两种处理方式:一是直接模拟,接收数据线判断长度,然后再分正整数和负整数进行模拟标记即可。很简单的处理方式但就是不明白在哪里有坑卡住了;二是转化为字符串的处理方式,将接收的字符串用itoal()函数先转为数字,这里可以遇到不合法的字符就会终止,然后再用sprintf()函数将其转化为字符串,最后用strcmp()函数进行比较是否相等,且在[a,b]范围内,则输出“YES”,反之为"NO".两种写法详见code。
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=5059
高大上的字符串code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
using namespace std;
const int MAXN = 100+10;
char str[MAXN],cp[MAXN];
int k,a,b;
int main(){
//freopen("input.txt","r",stdin);
while(gets(str)){
scanf("%d%d",&a,&b);
getchar();
int x=atoi(str);
sprintf(cp,"%d",x);
if(strcmp(str,cp)==0 && x>=a && x<=b) puts("YES");
else puts("NO");
}
return 0;
}
直接模拟的code:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define ll __int64
const int MAXN = 100+10;
char str[MAXN],s[MAXN];
ll a,b,ans;
bool judge(char *s){
int len=strlen(s);
int id=0,sy=0;
ans=0;
if(s[0]=='-'){
++id;
sy=1;
}
if(len-id>12 || len==0) return false;
if(len==1 && s[0]=='-') return false;
if(s[id]<'0' || s[id]>'9') return false;
if(sy){
if(s[1]=='0') return false;
for(int i=id;i<len;++i){
if(s[i]<'0' || s[i]>'9') return false;
ans=ans*10+s[i]-'0';
}
ans=-ans;
if(ans>=a && ans<=b) return true;
}
else{
if(s[0]=='0' && len>1) return false;
for(int i=id;i<len;++i){
if(s[i]<'0' || s[i]>'9') return false;
ans=ans*10+s[i]-'0';
}
if(ans>=a && ans<=b) return true;
}
return false;
}
int main(){
//freopen("input.txt","r",stdin);
while(gets(str)){
scanf("%I64d %I64d",&a,&b);
getchar();
if(judge(str)) puts("YES");
else puts("NO");
}
return 0;
}
再来一个自己怎么都调不对的code:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define ll __int64
const int MAXN = 100+10;
ll a,b,ans;
char str[MAXN];
int main(){
//freopen("input.txt","r",stdin);
while(gets(str)){
scanf("%I64d %I64d",&a,&b);
getchar();
ans=0;
int len=strlen(str);
int id=0,flag=1,tmp=1,sy=0;
if(str[0]=='-'){ //标记正负数
++id;
sy=1;
}
if(len-id>12 || len==0){puts("NO");continue;} //长度判断
if(len==1 && str[0]=='-'){puts("NO");continue;}
for(int i=id;i<len;++i){
if(str[i]=='0' && tmp){flag=0;break;} //判断有没有前导0
else if(str[i]>='0' && str[i]<='9'){ //合法则计数
tmp=0;
ans=ans*10+str[i]-'0';
}
else{ //不合法字符出现则直接标记弹出
flag=0;
break;
}
}
if(sy) ans=0-ans; //负数转化
if(ans>=a && ans<=b && flag) puts("YES");
else puts("NO");
}
return 0;
}