QQ帐户的申请与登陆

实现QQ新帐户申请和老帐户登陆的简化版功能。最大挑战是:据说现在的QQ号码已经有10位数了。

输入格式:

输入首先给出一个正整数N(≤10
​5
​​ ),随后给出N行指令。每行指令的格式为:“命令符(空格)QQ号码(空格)密码”。其中命令符为“N”(代表New)时表示要新申请一个QQ号,后面是新帐户的号码和密码;命令符为“L”(代表Login)时表示是老帐户登陆,后面是登陆信息。QQ号码为一个不超过10位、但大于1000(据说QQ老总的号码是1001)的整数。密码为不小于6位、不超过16位、且不包含空格的字符串。

输出格式:

针对每条指令,给出相应的信息:

1)若新申请帐户成功,则输出“New: OK”;
2)若新申请的号码已经存在,则输出“ERROR: Exist”;
3)若老帐户登陆成功,则输出“Login: OK”;
4)若老帐户QQ号码不存在,则输出“ERROR: Not Exist”;
5)若老帐户密码错误,则输出“ERROR: Wrong PW”。

输入样例:

5
L 1234567890 [email protected]
N 1234567890 [email protected]
N 1234567890 [email protected]
L 1234567890 myQQ@qq
L 1234567890 [email protected]
输出样例:

ERROR: Not Exist
New: OK
ERROR: Exist
ERROR: Wrong PW
Login: OK
自己做的时候出现了段错误,看不出原因,只有第一个测试点过了,内存不够??

#include<stdio.h>
#include<string.h>
struct list{
	char name[100];
	char code[20];
};
int main()
{
	int n,i,top=0,j;
	scanf("%d",&n);
	struct list ss[10001];
	char xname[100],xcode[20],ch;
	for(i=0;i<n;i++)
	{
	  getchar();
	  scanf("%c %s %s",&ch,xname,xcode);
	  if(ch=='L')
	  {
	  	if(top==0)
	  	 printf("ERROR: Not Exist\n");
		else
		{
		  for(j=0;j<top;j++)
		  {
		  	if(strcmp(xname,ss[j].name)==0&&strcmp(xcode,ss[j].code)==0)
		  	 {
		  	 	printf("Login: OK\n");
		  	 	break;
			   }
			else if(strcmp(xname,ss[j].name)==0)
			{
				printf("ERROR: Wrong PW\n");
				break;
			}
		 }
		 if(j==top)
		  printf("ERROR: Not Exist\n");	
		 } 
	  }
	  else
	  {
	  	for(j=0;j<top;j++)
	  	 if(strcmp(xname,ss[j].name)==0)
	  	  break;
	  	if(j==top)
	  	{
	  		strcpy(ss[top].name,xname);
	  		strcpy(ss[top].code,xcode);
	  		top++;
	  		printf("New: OK\n");
		  }
		else
		 printf("ERROR: Exist\n");
	  }
	}
	return 0;
}

ac的代码
1 用散列

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
typedef struct id *ID;
struct id{
	long long IDname;
	char PassWord[17];
	ID next;
};
ID New(ID link,long long name,char pw[])
{
	if(!link||link->IDname>name)
	{
		ID N=(ID)malloc(sizeof(struct id));
		N->IDname=name;
		strcpy(N->PassWord,pw);
		N->next=link;
		printf("New: OK\n");
		return N;
	}
	else if(link->IDname==name)
	 printf("ERROR: Exist\n");
	else
	 link->next=New(link->next,name,pw);
	return link;
}
void Load(ID* link,long long name,char* pw)
{
	ID temp=link[name%100001];
	while(temp)
	{
		if(name==temp->IDname)
		{
			if(strcmp(pw,temp->PassWord))
			{
				printf("ERROR: Wrong PW\n");
			    return ;
			}
			else
			{
				printf("Login: OK\n");
				return ;
			}
		}
		else if(name<temp->IDname)
			break;
		else
		 temp=temp->next;
	}
	printf("ERROR: Not Exist\n");
}
int main()
{
	int n;
	scanf("%d",&n);
	ID *link=(ID *)malloc(sizeof(ID)*100001);
	for(int i=0;i<100001;i++)
	 link[i]=NULL;
	char control;
	long long name;
	char pw[30];
	for(int i=0;i<n;i++)
	{
		getchar(); 
		scanf("%c%lld%s",&control,&name,pw);
	    
		switch(control){
			case 'N': link[name%100001]=New(link[name%100001],name,pw);
			           break;
			case 'L': if(name>1000&&name<10000000000)
			           	Load(link,name,pw);
			          else
					   printf("ERROR: Not Exist\n");
					break;
		}
	}
	return 0;
}

2 c++(感觉真的好便利)

扫描二维码关注公众号,回复: 5021416 查看本文章
#include<iostream>
#include<map>
using namespace std;
map<string,string> s;
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		char c;
		string str1,str2;
		cin>>c>>str1>>str2;
		if(c=='L')
		{
			if(s.find(str1)==s.end())
			 cout<<"ERROR: Not Exist"<<endl;
			else if(s[str1]!=str2)
			 cout<<"ERROR: Wrong PW"<<endl;
			else
			 cout<<"Login: OK"<<endl;
		}
	    else
	    {
	    	if(s.find(str1)!=s.end())
	    	 cout<<"ERROR: Exist"<<endl;
	    	else 
	    	 {
	    	 	cout<<"New: OK"<<endl;
	    	 	s[str1]=str2;
			 }
		}
	 }
	 return 0; 
}

猜你喜欢

转载自blog.csdn.net/weixin_42859413/article/details/84961978