5-15 QQ帐户的申请与登陆 (25分)
实现QQ新帐户申请和老帐户登陆的简化版功能。最大挑战是:据说现在的QQ号码已经有10位数了。
输入格式:
输入首先给出一个正整数N(
105
),随后给出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 myQQ@qq.com
N 1234567890 myQQ@qq.com
N 1234567890 myQQ@qq.com
L 1234567890 myQQ@qq
L 1234567890 myQQ@qq.com
输出样例:
ERROR: Not Exist
New: OK
ERROR: Exist
ERROR: Wrong PW
Login: OK
思路
这是一个简单的复合程序。几个要点也都给出说明。
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
/*
评测结果
时间 结果 得分 题目 编译器 用时(ms) 内存(MB) 用户
2016-05-30 15:29 答案正确 25 11-散列3 gcc 79 7 569985011
测试点结果
测试点 结果 得分/满分 用时(ms) 内存(MB) 要点提示
测试点1 答案正确 10/10 2 1 sample 全部5种输出信息
测试点2 答案正确 7/7 77 7 最大表,全部是新申请,密码全部16位
测试点3 答案正确 8/8 79 5 N和L指令各一半,随机交错。帐号随机,取到上下界。密码随机,取到上下界
查看代码
解决方案:改为散列 存储,由于程序频繁要用到查询与插入,所以希望表的大小可以尽量大一点,并力求使所有的号码分布更为
分散斜,推荐使用二次增长,并使表长满足“是4k+3的素数” 。
*/
typedef struct id *ID;
struct id
{
long long IDNumber;
char PassWord[17];
ID Next ;
};
ID New(ID,long long,char*);
void Load(ID*,long long ,char*);
ID Build(long long,char*);
int main()
{
int n;
scanf("%d",&n);
getchar();
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++)
{
scanf(" %c%lld %s",&control,&name,pw);
// scanf("%s",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);
break;
}
printf("ERROR: Not Exist");
break;
default:
break;
}
printf("\n");
}
return 0;
}
void Load(ID*Link,long long name,char*pw)
{
ID temp=Link[name%100001];
while(temp)
{
if(temp->IDNumber==name)
{
if(strcmp(temp->PassWord ,pw))
{
printf("ERROR: Wrong PW");
return;
}
else{
printf("Login: OK");
return;
}
}else if(temp->IDNumber>name)break;
temp=temp->Next;
}
printf("ERROR: Not Exist");
return;
}
ID New (ID Link,long long name,char*pw)
{
if(!Link||Link->IDNumber>name)
{
ID N=(ID)malloc(sizeof(struct id));
N->IDNumber=name;
strcpy(N->PassWord,pw);
N->Next =Link;
printf("New: OK");
return N;
}
else if(Link->IDNumber==name)
{
printf("ERROR: Exist");
}
else Link->Next =New(Link->Next,name,pw);
return Link;
}