2021CSP-J网络连接题解

其实这道题不难,作者出成了小模拟

输入也可以利用sscanf解决

题目链接

题目分析

map不会冲突!!不一定要like代码中那样加-号!

模拟,算不上大,

首先,我们想想整个流程:

现在,我们找出难点,逐个瓦解:

  • 读入提取数 MIDDLE
  • 非法情况判断 HARD
  • 是否重复 EASY

从简到难解决。

是否重复

首先,将5个数字按次序组合成一个大数

本人测试:25525525525565535是long long存的下的,

然后map搞定。

就解决了,参考代码:

long long sum=0;
sum+=a;
sum*=1000;
sum+=b;
sum*=1000;
sum+=c;
sum*=1000;
sum+=d;
sum*=100000;
sum+=e;//转换
if(s=="Server")
{
	if(m[-sum])
	{
		cout<<"FAIL"<<endl;
		continue; 
	}
	m[-sum]=T;//记录这个服务机的编号,后边客户机要用
	cout<<"OK"<<endl;
} 
else
{
	if(!m[-sum])
	{
		cout<<"FAIL"<<endl;
		continue; 
	}
	cout<<m[-sum]<<endl;//输出服务机的编号
}

读入提取数

怎么提取数字呢?

其实也不难,

scanf支持格式输入,


scanf("%d.%d.%d.%d:%d",&a,&b,&c,&d,&e)

输入

1.1.1.1:1

a=1,b=1,c=1,d=1,e=1a=1,b=1,c=1,d=1,e=1

如果不按格式?

1:1:1:1.1

a=1,b=0,c=0,d=0,e=0a=1,b=0,c=0,d=0,e=0

What?不按格式的部分值没有变化?

问题三有头绪了呢....

非法情况判断

通过如上方案,我们将五个数初始化为-1,

如果格式输入后有-1,那格式有误,非法。

参考代码:

a=-1,b=-1,c=-1,d=-1,e=-1; 
cin>>s;
scanf("%d.%d.%d.%d:%d",&a,&b,&c,&d,&e);
if(a==-1||b==-1||c==-1||d==-1||e==-1)
{
  cout<<"ERR"<<endl;
  continue;
}

同样的,判断数字是否超出范围:

if(a>255||b>255||c>255||d>255||e>65535)
{
 cout<<"ERR"<<endl;
 continue;			
}

你可能会问,如果输入了一个巨大的数,

long long溢出,怎么办?

别急,我们往下看。

前导零问题如何解决??

我们想想,因为前导零被变量“吃”了,

现在的字符串一定比之前的字符串短

我们判断即可。

怎么存下之前的字符串

使用sscanf

sscanf不同于scanf,它需要多一个字符串参数

相当于用scanf将字符串内容读了一遍

读入效果与scanf一样

这样,我们先读入一个字符串,

然后sscanf读入,

这样两个结果都存了下来,

鱼和熊掌的兼得。

a=-1,b=-1,c=-1,d=-1,e=-1; 
cin>>s;
cin>>cc;//sscanf的妙用
sscanf(cc,"%d.%d.%d.%d:%d",&a,&b,&c,&d,&e);
if(a==-1||b==-1||c==-1||d==-1||e==-1)
{
	cout<<"ERR"<<endl;
	continue;
}
if(a>255||b>255||c>255||d>255||e>65535)
{
	cout<<"ERR"<<endl;
	continue;			
}
if(len(a)+len(b)+len(c)+len(d)+len(e)+4!=strlen(cc))
{//len是一个判断数字长度的自定义函数
//+4是四个标点符号
	cout<<"ERR"<<endl;
	continue;			
}

其实,非法情况就都可以判走了,

因为

  • 前导零、整数超出、格式错误被判掉。
  • 多个数字显然长度不等。
  • long long 溢出,长度变小了。

好了,这道题其实不难,重点在函数使用的基本功

参考代码

#include<bits/stdc++.h>
using namespace std;
map<long long,int> m;
int n,a,b,c,d,e;
string s,s2;
char cc[105];
int len(int x)
{
	if(x==0)return 1;
	int ans=0;
	while(x)
	{
		ans++;
		x/=10;
	} 
	return ans;
} 
int main()
{
	cin>>n;
	for(int T=1;T<=n;T++)
	{
		a=-1,b=-1,c=-1,d=-1,e=-1; 
		cin>>s;
		cin>>cc;
		sscanf(cc,"%d.%d.%d.%d:%d",&a,&b,&c,&d,&e);
		if(a==-1||b==-1||c==-1||d==-1||e==-1)
		{
			cout<<"ERR"<<endl;
			continue;
		}
		if(a>255||b>255||c>255||d>255||e>65535)
		{
			cout<<"ERR"<<endl;
			continue;			
		}
		if(len(a)+len(b)+len(c)+len(d)+len(e)+4!=strlen(cc))
		{
			cout<<"ERR"<<endl;
			continue;			
		}
		long long sum=0;
		sum+=a;
		sum*=1000;
		sum+=b;
		sum*=1000;
		sum+=c;
		sum*=1000;
		sum+=d;
		sum*=100000;
		sum+=e;
		if(s=="Server")
		{
			if(m[-sum])
			{
				cout<<"FAIL"<<endl;
				continue; 
			}
			m[-sum]=T;
			cout<<"OK"<<endl;
		} 
		else
		{
			if(!m[-sum])
			{
				cout<<"FAIL"<<endl;
				continue; 
			}
			cout<<m[-sum]<<endl;		
		}
	}	
}

---------- 本文到此结束 感谢您的阅读 ----------

赞赏