PTA数据结构与算法题目集(中文) 7-15
7-15 QQ帐户的申请与登陆 (25 分)
实现QQ新帐户申请和老帐户登陆的简化版功能。最大挑战是:据说现在的QQ号码已经有10位数了。
输入格式:
输入首先给出一个正整数N(≤),随后给出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
题目分析:一道散列的基本题 读入后进行判断
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<malloc.h> 5 #include<math.h> 6 #include<string.h> 7 #define KEYLENGTH 16 8 #define MAXTABLESIZE 10000 9 10 typedef char ElementType[KEYLENGTH + 1]; 11 typedef struct LNode* PtrToLNode; 12 typedef PtrToLNode List; 13 struct LNode 14 { 15 ElementType QNumber; 16 ElementType QPassword; 17 PtrToLNode Next; 18 }; 19 typedef struct HblNode* HashTable; 20 struct HblNode 21 { 22 int TableSize; 23 List Heads; 24 }; 25 26 int NextPrime(int num) 27 { 28 int p = (num % 2) ? (num + 2) : (num + 1); 29 int i = 0; 30 while (p<MAXTABLESIZE) 31 { 32 for (i = (int)sqrt(p); i > 2; i--) 33 if (p % i == 0)break; 34 if (i == 2)break; 35 else 36 p += 2; 37 } 38 return p; 39 } 40 41 int Hash(ElementType QNumber, int TabelSize) 42 { 43 return atoi(QNumber + 3) % TabelSize; 44 } 45 46 HashTable BuildHashTable(int TabelSize) 47 { 48 HashTable H = (HashTable)malloc(sizeof(struct HblNode)); 49 H->TableSize = NextPrime(TabelSize); 50 H->Heads = (List)malloc(H->TableSize * sizeof(struct LNode)); 51 for (int i = 0; i < H->TableSize; i++) 52 { 53 H->Heads[i].QNumber[0] = '