1874: 蛤玮学计网
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1181 Solved: 183
Submit Status Web Board
Description
蛤玮最近学习了关于ip的知识,于是他迫不及待的想把新知识传授给她的妹子.蛤玮的妹子随便写下了一个字符串,蛤玮现在要告诉她这个字符串是不是一个合法的ip地址.
为简单考虑,仅考虑ipv4的情况,即合法ip为形同"a1.a2.a3.a4",且0<=ai<=255。
Input
第一行为一个整数T(1<=T<=20),代表数据组数。接下来T行每行一个字符串,其中不包含空格,Tab以及回车,长度不超过50。
Output
若合法,输出"Yes",否则输出"No"(不包含引号)。
Sample Input
210.105.240.51f.a.t.e
Sample Output
YesNo
HINT
我们认为010.105.240.051是合法的。
总结一下写不出来的原因:
WA好多次,看别人的才发现两个点之间不能没有数字,自己就没有举例子来试一试,根据题目的要求来考虑不同的情况,然后构造出相应的例子来验证自己的代码或者在写代码的时候对这些情况进行考虑,这样才能够最大可能地与出题人的要求想照应,注意:出题人就是绞尽脑汁来考虑某些特殊的情况使我们不太容易想到,然后根据这些情况构造数据来验证我们是否考虑全面,也就是说 不管出题还是解题都是要尽可能来找出题目的所有情况,而干巴巴思考不太容易想到,最好的方法就是把情况都列举出来,然后思考对应应得情况,所以解题的第一步就是通过构造数据,考虑题目的各种情况使自己的程序尽量包含所有情况,如果到最后又WA了,这时就更应该去自己写数据测试分析了,应为你可能考虑的你在写程序之前就已经判断出来了,WA的原因就是还有一些你没考虑到(或者是程旭编写方面的错误)如一些特殊的:0,负数等,这时如果你干想的话肯定要花费很长的时间还可能想不出来,所以就应该去举一些程序中没考虑到的特殊的数据来验证分析了;
还有一点就是分析时间空间复杂度,可能时间要求的更严一些,但也有不严的,就比如本题,如果一个好几个条件判断写在一个循环里面不清晰的话,时间允许,直接写多个循环一一判断不就行了,更清晰,检查更方便;
总结写题的步骤:1.读懂题目 自己能用简洁的语言描述题意;
2.分析题目 提取出题目所考察知识点(可能单一可能多个结合,如果想不到,常考知识优先考虑)分析复杂度 能用多大的的复杂度过 能不能优化 用哪种变量类型写;
3.归纳思路 有些一眼能看出来用哪种方法写 但大部分比赛都是靠归纳的 不可能一眼看出来 所以这时候就先分析题目所给数据(必须将这些情况写进思路) 但是题目所给的数据大部分不能够满足所有情况 所以尽量举多的不同的情况以包含所有的情况;
4.Debug 写出来看看有没有思路和代码照不上的情况 主要考虑变量取值范围数组大小是否合适输出格式有没有问题 如过找不出问题那就提交 提交如果没过 那就根据不同的提示找错误: WA:先检查代码有没有问题 如果没问题再想数据考虑是否某种情况落下了 MLE/TLE:看代码能不能优化了,如果不能就用该想有新的思路或用数据结构优化了。
AC代码:
#include<cstdio>
#include<cstring>
int main()
{
int T,i; char str[70];
scanf("%d",&T);
while(T--)
{
scanf("%s",str); int cnt=1,t=0; bool falg=true;
for(i=0;str[i];++i){
if(str[i]=='.'){
if(t==0) {
falg=false; break;
}
t=0; cnt++;
}
else if(str[i]>'9'||str[i]<'0') {
falg=false; break;
}
else ++t;
}
if(cnt!=3) falg=false;
int num=0;
if(falg) {
for(i=0;str[i]&&falg;++i) {
if(str[i]=='.') {
num=0;
}
else {
num=num*10+str[i]-'0';
}
if(num>255) falg=false;
}
}
printf(falg?"Yes\n":"No\n");
}
return 0;
}