历史最全纠错
查看原帖
历史最全纠错
241817
Chancylaser楼主2021/11/2 23:57

纯作者感想,因为作者很菜,所以这些错误要是都没事非常大的概率能A,否则@一下我。题目中的 a,b,c,d,ea,b,c,d,e 超额,点和冒号不是3个和1个等基础问题这里不再提出,而是提出较容易出错的类型。

1.1. <类型> 090.01.10.10.10 //注意第一个空格之后有一个前缀0,第二个数字有一个前缀0。

2.2. <类型> .(此处省略): //概括来说就是点或冒号在两边的情况。

3.3.

一个服务机是
Server 117.50.48.70:53043.0

客户机是

Client 117.50.48.70:53043

显然前面的5个数字都能对上,但是这个服务机却是不合法的,所以不行,但是您的代码可能输出其它的错误答案。

4.4. 两个点在一起的情况。如:<类型> 1..1.1:1 //虽然符号的数量符合但是仍然错误,需要判一下


这里附上我的非常好理解的代码。还有我的找不同程序。这个程序可以帮助您对一下哪个地方和数据输出不同,建议配合fc一起使用。

已A

#include<bits/stdc++.h>
using namespace std;
int n;char qwq;
struct comp{
	string s;
	long long a[15];
	//分别为(1开始) a b c d e  , : 
	bool xz;
	bool qdl,shai;//qdl包括前缀0和以上除第三种情况的判断;shai是用来标记此机器是否合理,主要用于判断第三种情况。
}e[1005];
int k;
int main(){
	cin>>n;qwq=getchar();
	for(int i=1;i<=n;i++){
		getline(cin,e[i].s);k=1;
		int len=e[i].s.size()-1;
		int cmp=0;
		for(int j=7;j<=len;j++){
			if(e[i].s[j]=='.'){
				e[i].a[6]++;
				cmp=1;
				if(!(e[i].s[j-1]>='0'&&e[i].s[j-1]<='9')||!(e[i].s[j+1]>='0'&&e[i].s[j+1]<='9')){
					e[i].qdl=1;
					break;
				} 
			} 
			else if(e[i].s[j]==':'){
				e[i].a[7]++;
				cmp=1;	
				if(!(e[i].s[j-1]>='0'&&e[i].s[j-1]<='9')||!(e[i].s[j+1]>='0'&&e[i].s[j+1]<='9')){
					e[i].qdl=1;
					break;
				} 
			} 
			else if(e[i].s[j]=='0'&&e[i].s[j-1]==' '&&e[i].s[j+1]>='0'&&e[i].s[j+1]<='9'){
				e[i].qdl=1;
				break;
			}
			else if(e[i].s[j]>='0'&&e[i].s[j]<='9'){
				if(cmp==1){
					k++;cmp=0;
					if(e[i].s[j]=='0'&&e[i].s[j+1]>='0'&&e[i].s[j+1]<='9'){
						e[i].qdl=1;
						break;
					}
				} 
				e[i].a[k]*=10;
				e[i].a[k]+=e[i].s[j]-'0';
			}
			else{
				e[i].qdl=1;
				break;
			} 
		}
		if(e[i].s[0]=='C') e[i].xz=1;
	}
	for(int i=1;i<=n;i++){
		if(e[i].xz==0){
			bool keyi=1;
			if(e[i].qdl==1)
				cout<<"ERR\n",keyi=0,e[i].shai=1;		
			else if(e[i].a[6]>3||e[i].a[6]<3||e[i].a[7]>1||e[i].a[7]<1)
				cout<<"ERR\n",keyi=0,e[i].shai=1;
			else if(e[i].a[1]>255||e[i].a[2]>255||e[i].a[3]>255||e[i].a[4]>255||e[i].a[5]>65535)
				cout<<"ERR\n",keyi=0,e[i].shai=1;
			else	
				for(int j=1;j<i;j++)
					if(e[i].a[1]==e[j].a[1]&&e[i].a[2]==e[j].a[2]&&e[i].a[3]==e[j].a[3]&&e[i].a[4]==e[j].a[4]&&e[i].a[5]==e[j].a[5]&&e[j].xz==0&&!e[j].shai){
						cout<<"FAIL\n";
						keyi=0;
						break;
					}
			if(keyi==1)
				cout<<"OK\n";
		}
		if(e[i].xz==1){
			if(e[i].qdl==1)
				cout<<"ERR\n";
			else if(e[i].a[6]>3||e[i].a[6]<3||e[i].a[7]>1||e[i].a[7]<1)
				cout<<"ERR\n";
			else if(e[i].a[1]>255||e[i].a[2]>255||e[i].a[3]>255||e[i].a[4]>255||e[i].a[5]>65535)
				cout<<"ERR\n";
			else
				for(int j=0;j<i;j++){
					if(e[i].a[1]==e[j].a[1]&&e[i].a[2]==e[j].a[2]&&e[i].a[3]==e[j].a[3]&&e[i].a[4]==e[j].a[4]&&e[i].a[5]==e[j].a[5]&&e[j].xz==0&&!e[j].shai){
						cout<<j<<"\n";
						break;
					}					
					if(j==i-1)
						cout<<"FAIL\n";						
				}
		}
	}
	return 0;
}
找不同程序,比较两个输出,一个是标准输出,一个是自己的输出,看看哪里不同

#include<bits/stdc++.h>
using namespace std;
string a[1005],b[1005];
int main(){
	for(int i=1;i<=1000;i++)
		getline(cin,a[i]);
	for(int i=1;i<=1000;i++)
		getline(cin,b[i]);	
	for(int i=1;i<=1000;i++)
		if(a[i]!=b[i]){
			cout<<i<<endl;
			break;
		}
	return 0;
}

声明:此短文并不是讨论区题解,而是为了后人写的一篇小小的纠错短文/kk。

如果还有啥比较容易错的形式可以在下面提出,因为我的这些都是根据我的代码来的
2021/11/2 23:57
加载中...