华为oj 判断两个IP是否属于同一子网
2016-01-24 18:59
609 查看
这道题,如果假设输入的ip一定是**.**.**.**这种格式的话,可以采用格式化输入进行获取,对于合法性判断,保证ip每一部分都是大于等于0,小于等于255,就好对于子网掩码判断能难一点,需要保证前面的都是1,后面的都是0,直接上代码:
#include<iostream> using namespace std; int main() { int ip1[4], ip2[4], subnet[4], flag, ip1_r, ip2_r, subnet_r,temp, firstbit; scanf_s("%d.%d.%d.%d", subnet, subnet + 1, subnet + 2, subnet + 3); scanf_s("%d.%d.%d.%d", ip1, ip1 + 1, ip1 + 2, ip1 + 3); scanf_s("%d.%d.%d.%d", ip2, ip2 + 1, ip2 + 2, ip2 + 3); for (int i = 0; i<4; i++) { if (ip1[i]<0 || ip1[i]>255 || ip2[i]<0 || ip2[i]>255)//判断ip { cout << "1" << endl; return 0; } } ip1_r = (ip1[0] << 24) | (ip1[1] << 16) | (ip1[2] << 8) | (ip1[3]); ip2_r = (ip2[0] << 24) | (ip2[1] << 16) | (ip2[2] << 8) | (ip2[3]); subnet_r = (subnet[0] << 24) | (subnet[1] << 16) | (subnet[2] << 8) | (subnet[3]); firstbit = 1 << 31; //判断子网前面必须都是1,后面都是0 flag = 0; temp = subnet_r; while (temp) { if (temp&firstbit != 1) { flag = 1;//由1变为0 } else { if (flag == 1) { cout << "1" << endl; return 0; } } temp <<= 1; } if ((subnet_r&ip1_r) == (subnet_r&ip2_r)) { cout << "0" << endl; } else { cout << "2" << endl; } return 0; }
结论:华为oj中有几道关于ip的题,都可以通过格式化输入,然后拼接成一个数进行操作。
相关文章推荐
- JNI——在C中输出日志
- js原型(2)
- 【Usaco2008 Oct 资格赛】灌水 和 Islands and Bridges
- O2O领域添新军,正品网加快布局的战略考量
- 对于python,一切事物都是对象,对象基于类创建
- 要买多少路由器? 水题.
- [ROS]GMapping SLAM
- 车辆售票坐位图
- Python爬虫入门(1):综述
- Java字符转C的思路
- STM32 堆和栈的学习(二)
- andorid jni入门教程一之helloworld
- usaco-Section 2.4-Cow Tours
- css学习之id和class选择器
- Java 异常的注意事项
- Nginx服务器
- Android JNI开发生成.h头文件问题
- 2015年OpenWRT路由器挂载RT3070 USB无线网卡
- usaco-Section 2.4-Bessie Come Home
- 由子网掩码字符串转换成长度前缀的代码示例