实现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 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<iostream>
#include<string>
#include<map>
using namespace std; map<string, string> mp;
void Login(string account, string passwd);
void Create(string account, string passwd); int main()
{
int n;
char c;
string account, passwd; cin >> n;
for (int i = ; i < n; i++)
{
getchar();
cin >> c >> account >> passwd;
switch (c)
{
case 'L':
Login(account, passwd);
break;
case 'N':
Create(account, passwd);
break;
}
} return ;
} void Login(string account, string passwd)
{
if (mp.find(account) != mp.end())
{
if (passwd == mp[account])
{
cout << "Login: OK" << endl;
}
else
{
cout << "ERROR: Wrong PW" << endl;
}
}
else
{
cout << "ERROR: Not Exist" << endl;
}
} void Create(string account, string passwd)
{
if (mp.find(account) != mp.end())
{
cout << "ERROR: Exist" << endl;
}
else
{
mp[account] = passwd;
cout << "New: OK" << endl;
}
}

map如果在栈中定义,地址作为函数参数传到函数中,函数中用map型指针接收的思路,还没有通过。

用创建链表的方式代替map功能

#include<cstdio>
#include<cstdlib>
#include<cstring>
const int maxn = ; typedef struct ListNode* Position;
typedef struct Table* HashTable; struct ListNode
{
char account[];
char password[];
Position next;
}; struct Table
{
Position List;
int TableSize;
}; HashTable createTable(int size);
int NextPrime(int size);
void Insert(HashTable H, char *account, char *password);
Position Find(HashTable H, char *key);
int Find_account(HashTable H, char *account);
int check_password(Position P, char *password);
void DestoryTable(HashTable H); int main()
{
int n;
scanf("%d", &n);
HashTable H = createTable(n * ); char c;
char account[];
char password[];
for (int i = ; i < n; i++)
{
getchar();
scanf("%c %s %s", &c, account, password);
switch(c)
{
case 'N':
if (- == Find_account(H, account))
{
Insert(H, account, password);
printf("New: OK\n");
}
else
{
printf("ERROR: Exist\n");
}
break;
case 'L':
if ( == Find_account(H, account))
{
if ( == check_password(Find(H, account), password))
{
printf("Login: OK\n");
}
else
{
printf("ERROR: Wrong PW\n");
}
}
else
{
printf("ERROR: Not Exist\n");
}
break;
}
}
//DestoryTable(H);
return ;
} HashTable createTable(int size)
{
//在堆区申请一个Table大小的内存,转化成该结构体指针类型返回
HashTable H = (HashTable)malloc(sizeof (struct Table));
H->TableSize = NextPrime(size);
H->List = (Position)malloc(sizeof(struct ListNode) * H->TableSize);
for (int i = ; i < H->TableSize; i++)
{
H->List[i].next = NULL;
}
return H;
} int NextPrime(int size)
{
for (int tmpSize = size; ; tmpSize++)
{
int i = ;
for ( ; i * i <= tmpSize; i++)
{
if (tmpSize % i == )
{
break;
}
} if (i * i > tmpSize)
{
return tmpSize;
}
}
} void Insert(HashTable H, char *account, char *password)
{
int h = atoi(account+) % H->TableSize; /*Position P = H->List[h].next;
while(P && strcmp(P->account, account))
{
P = P->next;
}*/
Position P = Find(H, account);
if (P == NULL) //头插法
{
Position tmp = (Position)malloc(sizeof (struct ListNode));
strcpy(tmp->account, account);
strcpy(tmp->password, password);
tmp->next = H->List[h].next;
H->List[h].next = tmp;
}
} Position Find(HashTable H, char *key)
{
int h = atoi(key+) % H->TableSize;
Position P = H->List[h].next;
while( P != NULL && strcmp(P->account, key))
{
//节点存在,并且节点的账户不是传进来的key
P = P->next;
}
return P;
} int Find_account(HashTable H, char *account)
{
Position P = Find(H, account);
if (P)
{
return ;
}
else
{
return -;
}
} int check_password(Position P, char *password)
{
if ( == strcmp(P->password, password))
{
return ;
}
else
{
return ;
}
} void DestoryTable(HashTable H)
{
for (int i = ; i < H->TableSize; i++)
{
Position P = H->List[i].next;
while (P)
{
Position tmp = P->next;
free(P);
P = tmp;
}
}
free(H->List);
free(H);
}

11-散列3 QQ帐户的申请与登陆 (25 分)的更多相关文章

  1. PTA 11-散列3 QQ帐户的申请与登陆 (25分)

    题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/723 5-15 QQ帐户的申请与登陆   (25分) 实现QQ新帐户申请和老帐户登陆的简 ...

  2. 5-15 QQ帐户的申请与登陆 (25分) HASH

    实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式: 输入首先给出一个正整数NN(\le 10^5≤10​5​​),随后给出NN行指令.每行指令的格 ...

  3. 11-散列3 QQ帐户的申请与登陆 (25 分)

    实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式: 输入首先给出一个正整数N(≤),随后给出N行指令.每行指令的格式为:“命令符(空格)QQ号码( ...

  4. QQ帐户的申请与登陆

    QQ帐户的申请与登陆 实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式: 输入首先给出一个正整数N(≤10^5,随后给出N行指令.每行指令的格式为 ...

  5. 第7章学习小结 不使用STL-map过实践题:QQ帐户的申请与登陆

    目录: 一:查找的概念与术语 二:折半查找 三:二叉排序树 四:平衡二叉树 五:B-树 六:B+树 七:散列表 八:实践题:QQ帐户的申请与登陆 九:自我总结 一.查找的概念与术语 (一)查找表 查找 ...

  6. 7-15 QQ帐户的申请与登陆

    7-15 QQ帐户的申请与登陆(25 分) 实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式: 输入首先给出一个正整数N(≤10​5​​),随后给 ...

  7. 【PTA 天梯赛训练】QQ帐户的申请与登陆(散列+set模拟)

    实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式: 输入首先给出一个正整数N(≤10^5),随后给出N行指令.每行指令的格式为:“命令符(空格)Q ...

  8. 浙江大学PAT上机题解析之5-05. QQ帐户的申请与登陆

    实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式说明: 输入首先给出一个正整数N(<=105),随后给出N行指令.每行指令的格式为:“命令符 ...

  9. QQ帐户的申请与登陆-(字符串操作)

    题目: 实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式: 输入首先给出一个正整数N(≤10^5),随后给出N行指令.每行指令的格式为:“命令符( ...

随机推荐

  1. ReentrantReadWriteLock三个线程读数据,三个线程写数据

    /*** * 三个线程读数据,三个线程写数据 * */ public class ReadWriteLockTest { public static void main(String[] args) ...

  2. Prometheus 安装Grafana与Prometheus集成

    Prometheus 安装Grafana与Prometheus集成 Grafana是一个开源的度量分析和可视化系统. 下载地址:https://grafana.com/grafana/download ...

  3. Java学习:注解简介

    JAVA 注解的基本原理 以前,『XML』是各大框架的青睐者,它以松耦合的方式完成了框架中几乎所有的配置,但是随着项目越来越庞大,『XML』的内容也越来越复杂,维护成本变高. 于是就有人提出来一种标记 ...

  4. linux服务器可以访问IP访问不了域名地址

    1.curl www.baidu.com报错,curl 183.232.231.173可以或者nslookup+域名,nslookup+IP2.这个是因为linux服务器没有配置DNS域名服务器地址导 ...

  5. 深入V8引擎-默认Platform之mac篇(1)

    又到了常规的堆砌代码凑文章字数环节,很多API我就直接贴官方的英文释义,个人翻译其实有时候并不是很准确,搞错了甚至会误导,还是尽量自己去理解. 首先看看入口方法. std::unique_ptr< ...

  6. 防止jQuery .on多次绑定

    jQuery off() 方法 $("button").click(function(){$("p").off("click");}); 参 ...

  7. C# winform中组合键奇怪不响应问题

    再winform中使用ProcessCmdKey处理快捷键响应,针对单一快捷键响应没有任何问题.但是针对组合键总是无法响应,如下: protected override bool ProcessCmd ...

  8. 记一次CSS反爬

    目标网址:猫眼电影 主要流程 爬取每一个电影所对应的url 爬取具体电影所对应的源码 解析源码,并下载所对应的字体 使用 fontTools 绘制所对应的数字 运用机器学习的方法识别对应的数字 在源码 ...

  9. Chrome headless三种安装方法

    在使用chrome headless的时候,使用安装源有很多的依赖问题,提供三种方法,最简单的是使用一键安装脚本. 1.添加chrome源来安装chrome 添加源: ## 添加:vim /etc/y ...

  10. MySQL单表数据不要超过500万行:是经验数值,还是黄金铁律?

    本文阅读时间大约3分钟. 梁桂钊 | 作者 今天,探讨一个有趣的话题:MySQL 单表数据达到多少时才需要考虑分库分表?有人说 2000 万行,也有人说 500 万行.那么,你觉得这个数值多少才合适呢 ...