ZZULI OJ 1874: 蛤玮学计网【讨论(解题分析总结)】

1874: 蛤玮学计网

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 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;
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值