菊花厂机试题。
一杯咖啡5元,只收5,10,20面额的钱。
输入一串字符串,表示收到的钱,如果能找零,则输出true,编号;
如果无法找零,则输出false,不能找零的顾客编号;
如果输入的不是5,10,20则直接输出false,和给出错误钱数的编号。
#include <iostream>
#include <iomanip>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
int main()
{
while (1)
{
string num, tmp;
getline(cin, num);
vector<string> data;
stringstream input(num);
while (getline(input, tmp, ',')) data.push_back(tmp);//按逗号分隔
int size = data.size();
int *money = new int[size];//申请动态分配的空间
int five_num = 0;
int ten_num = 0;
int pos = 0;
bool flag = 0;//能否找零成功标志位
for (int i = 0; i < size; i++)
{
money[i] = stoi(data[i]);//字符串转int
if (money[i] == 5)
five_num += 1;
else if (money[i] == 10)
{
ten_num += 1;
if (five_num > 0)
five_num -= 1;//用5块找零
else
{
pos = i;
flag = 1;
break;
}
}
else if (money[i] == 20)
{
if (ten_num > 0&&five_num >0)
{
ten_num -= 1;//用10块和5块找零
five_num -= 1;
}
else if (five_num >2)
five_num -= 3;//用三张5块找零
else
{
pos = i;
flag = 1;
break;
}
}
else
{
pos = i; //钱数错误,不是5,10,20
flag = 1;
break;
}
}
if (flag)
cout << "false," << pos+1 << endl;
else
cout << "true," << size<< endl;
flag = 0;
delete[]money; //释放申请的动态空间
}
return 0;
}