5元咖啡与找零

菊花厂机试题。
一杯咖啡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;
}
原文地址:https://www.cnblogs.com/j-c-y/p/13493083.html