厦门理工第二届程序设计大赛 正确的IP

Description//描述

在网络课程上,我学到了很多有关IP的知识。IP全称叫网际协议,有时我们又用IP来指代我们的IP网络地址,现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),如172.16.163.66(每个部分的范围是0-255)是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32位数字)。,
但是粗心的我,常常将IP地址写错,现在需要你用程序来判断。

Input//输入

输入数据第一行是一个正整数N(1 <= N <= 20),表示有N组数据需要判断。
接下来的N行表示N组数据。

Output//输出

对于每组输入数据,判断输入的IP是否正确,如果正确输入YES,否则NO。

Sample Input//输入案例

3
172.16.290.3
192.168.100.16
223.16.34.2.3

Sample Output//输出案例

NO
YES
NO



思路

因为输入 IP 要输入 ’ . ’ 这个字符,所以我们可以想到用一个二维的字符数组去存放我们要输入的 IP

char ip[20][32];

要在输入数据之后再输出YES或者NO,所以我们要将结果先储存一下,这里我用 bool 类型的数组。

bool is_ip[20];

IP通过 ‘.’ 分为4个部分,所以判断是否合理的条件之一是 : 有且仅有3个 ‘.’

if (num != 3)
			is_ip[i] = false;

每个IP中的一小部分的数字最大不能超过255

if (sum > 255)
				{
					is_ip[i] = false;
					need = true;
					break;
				}
  1. 小 Tip
    在代码运行的过程中其实有一点,当我们判断的条件中有一个不满足的时候其实就可以进行下一个IP的判断了。
    例如 当 ‘.’ 的数量不是三个的时候 、 当IP的四个部分中有一个部分的值超过了255,都可以直接进行下一个IP的判断。
    利用好这一点可以加快程序的运行速度

所以我用一个bool类型的数据来表示我们是否需要跳过

bool need=false;

可能会遇到的困难

  1. 或许不知道怎么将某个部分的数字提取出来

一个字符数组我们是如何把它的字符转换成数字的呢?

  • 例如
int Sum;
char Array[3]={1,2,3};

可以通过这个字符数组数字间的关系来求和

Sum = Array[0]*100 + Array[1]*10 + Array[2]*1 ;

那么思路就很清晰了

  • 因为我们发现一开始 Sum = 0,而将整个字符数组遍历后 第一位增大了100倍,其实这个100也就是数组的长度 - 1。

  • 因此我们可以根据先后读取的顺序来求得Sum。
    这里还是拿那个Array举个例子

for(int i=0;i<3;i++)
Sum = sum * 10 + ( Array[i] - '0' );
  • 这样每轮循环最先进去的数字就会被放大10倍啦!

注意字符转换成整型是根据ASCII码进行转换的

代码实现部分

#include
#include
using namespace std;//头文件 命名空间
int main()
{
	int i, j,k, num=0, sum = 0, N,len;
	char ip[20][32];
	bool is_ip[20],need;
	cin >> N;
	for (i = 0; i < N; i++)
	is_ip[i] = true;

	for (i = 0; i < N; i++)
	{
		cin >> ip[i];
		len =strlen(ip[i]);

		need = false;//需要直接进行下一轮吗
		for (j = 0; j < len; j++)
		{
			while (ip[i][j]!='.')
			{
				sum = sum * 10 + (ip[i][j] - '0');
				if (sum > 255)
				{
					is_ip[i] = false;
					need = true;
					break;
				}
				j++;
				if (j == len)
					break;
			}
			
			sum = 0;
			if (need) 
				break;
			if (ip[i][j] == '.')
				num++;
		}
		
		if (num != 3)
			is_ip[i] = false;
		num = 0;
		
	}



	for (i = 0; i < N; i++)
	{
		if (is_ip[i])
			cout << "YES\n";
		else
			cout << "NO\n";
	}
	return 0;
}



你可能感兴趣的:(数据结构与算法,c++,oj系统,经验分享,其他,cpp)