• PTA数据结构与算法题目集(中文) 7-15


    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] = '';
     54         H->Heads[i].QPassword[0] = '';
     55         H->Heads[i].Next = NULL;
     56     }
     57     return H;
     58 }
     59 
     60 PtrToLNode Find(ElementType Qnumber, HashTable H)
     61 {
     62     int i = Hash(Qnumber,H->TableSize);
     63     PtrToLNode P = H->Heads[i].Next;
     64     while (P && strcmp(P->QNumber, Qnumber))
     65         P = P->Next;
     66     return P;
     67 }
     68 void Insert(ElementType QNumber,ElementType QPassword,HashTable H)
     69 {
     70     PtrToLNode P, NewCell;
     71     P = Find(QNumber, H);
     72     if (!P)
     73     {
     74         int i = Hash(QNumber, H->TableSize);
     75         NewCell = (PtrToLNode)malloc(sizeof(struct LNode));
     76         strcpy(NewCell->QNumber, QNumber);
     77         strcpy(NewCell->QPassword, QPassword);
     78         NewCell->Next = H->Heads[i].Next;
     79         H->Heads[i].Next = NewCell;
     80     }
     81 }
     82 
     83 void Order_L(HashTable H)
     84 {
     85     ElementType QNumber;
     86     ElementType QPassword;
     87     scanf("%s %s", QNumber, QPassword);
     88     PtrToLNode P = Find(QNumber, H);
     89     if (P)
     90     {
     91         if (!strcmp(P->QPassword, QPassword))
     92             printf("Login: OK
    ");
     93         else
     94             printf("ERROR: Wrong PW
    ");
     95     }
     96     else
     97         printf("ERROR: Not Exist
    ");
     98 }
     99 void Order_N(HashTable H)
    100 {
    101     ElementType QNumber;
    102     ElementType QPassword;
    103     scanf("%s %s", QNumber, QPassword);
    104     PtrToLNode P = Find(QNumber, H);
    105     if (P)
    106         printf("ERROR: Exist
    ");
    107     else
    108     {
    109         Insert(QNumber, QPassword, H);
    110         printf("New: OK
    ");
    111     }
    112 }
    113 void CreateHashTable()
    114 {
    115     int N;
    116     scanf("%d
    ", &N);
    117     HashTable H = BuildHashTable(N);
    118     while (N--)
    119     {
    120         char Order[2];
    121         scanf("%s", Order);
    122         switch (Order[0])
    123         {
    124         case 'L':Order_L(H); break;
    125         case 'N':Order_N(H); break;
    126         }
    127     }
    128 }
    129 
    130 int main()
    131 {
    132     CreateHashTable();
    133     return 0;
    134 }
    View Code
  • 相关阅读:
    Labshare 生物信息学在线软件集锦
    为什么要给单个细胞测序?
    两行代码解决Android9.0 CLEARTEXT communication not supported: [ConnectionSpec...
    Android 网络框架:Retrofit2一篇就够了(2020-4-23)
    Android通用流行框架大全
    base64图片裁剪空白区域
    常用的几款抓包工具
    Message: 'chromedriver' executable needs to be in PATH
    nginx+lua+redis做访问鉴权
    win10安装markdownpad2打开显示错误this view has crashed!
  • 原文地址:https://www.cnblogs.com/57one/p/11602090.html
Copyright © 2020-2023  润新知