IP地址合法性(模拟逻辑运算)

来源:互联网 发布:star法则 程序员 编辑:程序博客网 时间:2024/06/08 10:01


Problem Link:http://139.129.36.234/problem.php?id=1231


1231: IP地址合法性

时间限制: 1 Sec  内存限制: 128 MB
提交: 4  解决: 3
[提交][状态][讨论版]

题目描述

IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。点分十进制IP是由是4个0~255的数字中间加点构成,如192.168.1.123。我们可以通过子网掩码得到IP的网络号和主机号,其方法是与IP和对应二进制做位与运算。由于主机号全0和全1被用作特殊用途,不能分配给网络中的主机。给定一组IP和其子网掩码,判断是否可以分配给该网络中的主机。

输入

输入多组数据,每组包含两行,第一行为IP地址,有4个0~999的数字组成,中间用点号分割。第二行为子网掩码,由4个0~255数字组成,中间用点号分割。子网掩码保证合法。

输出

对于每组输入数据,判断是否合法,如果合法就输出Yes否则输出No

样例输入

192.168.1.3255.255.255.0103.139.56.255255.255.255.0100.256.1.3255.255.0.0

样例输出

YesNoNo

提示

来源

2016华中科技大学计算机复试



AC code:

#include<iostream>#include<algorithm>#include<stdio.h>#include<map>#include<math.h>#include<string.h>#include<queue>#include<vector>#include<set>#define LL long long#define exp 1e-9#define MAXN 1000010using namespace std;int ip[5],mark[5],c[5];void judge(){int i,j,cnt,m,tmp,hou,fg;for(i=1;i<=4;i++){if(ip[i]<0 || ip[i]>255){printf("No\n");return;}}i=1;cnt=0;while(mark[i]==255){cnt++;c[i]=ip[i];i++;}cnt++;//printf("cnt=%d\n",cnt);c[cnt]= ip[cnt] & mark[cnt];m=0;tmp=c[cnt];while(tmp && (tmp & 1) == 0){m++;tmp>>=1;}if(m==0){fg=0;for(i=4;i>=cnt;i--){if(ip[i]!=0){fg=1;break;}}if(fg==0){printf("No\n");return;}fg=1;for(i=4;i>=cnt;i--){if(ip[i]!=255){fg=0;break;}}if(fg==1){printf("No\n");return;}printf("Yes\n");return;}fg=0;for(i=4;i>cnt;i--){if(ip[i]!=0){fg=1;break;}}if(fg==0){i=0;tmp=ip[cnt];while(1){if((tmp & 1)==0){i++;tmp>>=1;if(i==m){printf("No\n");return;}}else{break;}}}fg=1;for(i=4;i>cnt;i--){if(ip[i]==0){fg=0;break;}}if(fg==1){i=0;tmp=ip[cnt];while(1){if((tmp & 1)==1){i++;tmp>>=1;if(i==m){printf("No\n");return;}}else{break;}}}printf("Yes\n");}int main(){//freopen("D:\\in.txt","r",stdin);      while(scanf("%d.%d.%d.%d",&ip[1],&ip[2],&ip[3],&ip[4])!=EOF)    {    scanf("%d.%d.%d.%d",&mark[1],&mark[2],&mark[3],&mark[4]);    judge();}return 0;}


1 0
原创粉丝点击