一些银行希望实施支持以下操作的客户账户管理系统: -
为客户账户充值;
- 从账户中取款;
- 要求账户上的资金余额;
- 客户账户之间的汇款;
- 计算所有客户的利息。
有必要实施这样的系统。银行客户由其名称(不包含空格的唯一字符串)标识。最初,该银行没有一个客户。一旦客户进行存款、取款或转账,他就会获得一个余额为零的账户。所有进一步的操作都只用这个帐户进行。帐户上的金额可以是正数也可以是负数,但它始终是整数。
首先,输入要执行的操作数 n (n <= 50000)。接下来的 n 行包含操作本身:
DEPOSIT name sum — 将金额总和记入客户名称的账户。如果客户没有帐户,则创建一个帐户。
WITHDRAW name sum - 从客户名称的账户中提取金额。如果客户没有帐户,则创建一个帐户。
余额名称 - 找出客户帐户名称上的余额。
TRANSFER name1 name2 sum — 将金额 sum 从客户 name1 的账户转移到客户 name2 的账户。如果客户没有帐户,则会为他创建一个帐户。
INCOME p — 将账户金额的 p% 计入所有已开立账户的客户。只有账户余额为正的客户才会产生利息,如果客户的余额为负,那么他的账户不会改变。计息后,账户上的金额保持不变,即只计提整数个货币单位。应计利息的小数部分被丢弃。
对于每个 BALANCE 请求,必须显示该客户帐户的余额。如果具有请求名称的客户没有银行帐户,则打印 ERROR。
示例:
输入:
7
存款 Ivanov 100
收入 5
余额 Ivanov
转账 Ivanov Petrov 50
取款 Petrov 100
余额 Petrov
余额 Sidorov
输出:
105
-50
错误
我用 C++ 编写了代码:
#include <iostream>
#include <map>
#include <string>
using namespace std;
void deposit(map<string, long long> &bank, string &name, long long &sum)
{
if (bank.find(name) == bank.end())
bank[name] = 0;
bank[name] += sum;
}
void withdraw(map<string, long long> &bank, string &name, long long &sum)
{
if (bank.find(name) == bank.end())
bank[name] = 0;
bank[name] -= sum;
}
string balance(map<string, long long> &bank, string &name)
{
if (bank.find(name) == bank.end())
return "ERROR";
return to_string(bank[name]);
}
void income(map<string, long long> &bank, float percent)
{
for (auto it = bank.begin(); it != bank.end(); ++it)
{
if (it->second > 0)
{
bank[it->first] = it->second * (100 + percent) / 100;
}
}
}
int main()
{
map<string, long long> bank;
long long n, val; cin >> n;
string command, name, name2;
for (long long i = 0; i < n; i++)
{
cin >> command;
if (command == "DEPOSIT")
{
cin >> name >> val;
deposit(bank, name, val);
}
else if (command == "WITHDRAW")
{
cin >> name >> val;
withdraw(bank, name, val);
}
else if (command == "BALANCE")
{
cin >> name;
cout << balance(bank, name) << endl;
}
else if (command == "TRANSFER")
{
cin >> name >> name2 >> val;
withdraw(bank, name, val);
deposit(bank, name2, val);
}
else if (command == "INCOME")
{
float value;
cin >> value;
income(bank, value);
}
}
}
在某些测试中,它显示错误的答案。我无法弄清楚错误在哪里。请告诉我它可以在哪里以及如何修复它?(我不知道测试数据...)
好吧,正如他们所说,你会笑,但是...
我在这里找到了你的问题。顺便说一句,如果你提供了检查系统的网址,而不是强迫你在网上到处搜索,一切都会变得更容易、更快……
但是,在那里,有必要不要
n
进入,而是要连续阅读所有内容直到最后。但是您的代码确实提供了部分解决方案,直到我重写了一行:在那之后,一切都奏效了,我被引导认为这是
percent
某种过度/不足/完成。用 on替换你的代码 确实挽救了这种情况。float
double
还有一件事 - 在进行存款/取款时检查是否存在是多余的,这段代码运行良好: