1. 程式人生 > 實用技巧 >嘉賓與幸運的中獎者程式設計題

嘉賓與幸運的中獎者程式設計題

今天有同學做菊花廠的校招機試題遇到這個問題。

題目要求

  • 輸入一個包含6個人名的字串,人名之間以空格隔開,人名不超過10個字元,第一個名字為嘉賓名字,後面5人為抽獎者名字;
  • 定義名字中a或者A的幸運值為1,z或者Z為26;
  • 後面5人中誰和嘉賓的幸運值相差最小,誰就獲獎,當出現幸運值相差最小的人數為複數時,選取其在名單中排名最靠後的。

①示例輸入

ccc aaa bbb fff AAZZ xyx

輸出

bbb

②示例輸入

ccc aaa bcb fff AAZZ cbb

輸出

cbb

程式

#include <iostream>
#include <sstream>
using namespace std;

int sum = 0;

int goal(string name)
{
	int length = name.length();
	int b[10];//人名不大於10個字元
	for (int i = 0; i < length; i++)
	{
		if (name[i] >= 'a'&&name[i] <= 'z')//如果為小寫字母
			b[i] = name[i] - 'a'+1;
		else ////如果為大寫字母
			b[i] = name[i] - 'A'+1;
	}
	//計算該人名的幸運值
	for (int i = 0; i < length; i++)
	{
		sum +=b[i];
	}
	return sum;
}

int main(int argc, char** argv) {
	while (1)
	{
		/*獲取字串*/
		string name_array;
		getline(cin, name_array);

		/*按空格分割人名*/
		istringstream str(name_array);
		string out;
		string name[6];
		int i = 0;
		while (str >> out) //遇到空格就結束條件判斷,執行函式體語句;直到串流全部輸出給string物件,值為0
		{
			name[i] = out;
			i++;
		}

		/*計算幸運值*/
		int b[6] = { 0 };
		for (int i = 0; i < 6; i++)
		{
			b[i] = goal(name[i]);
			sum = 0;
		}
		/*計算5名抽獎者和嘉賓的幸運值差值*/
		int c[5] = { 0 };
		for (int i = 0; i < 5; i++)
		{
			c[i] = b[i + 1] - b[0];
		}
		/*計算差值的絕對值*/
		int d[5] = { 0 };
		for (int i = 0; i < 5; i++)
		{
			if (c[i] < 0)
				d[i] = -c[i];
			else
				d[i] = c[i];
		}
		/*尋找差值絕對值中最小一個數字對應的下標,當有多個相同最小值時,取最後一個的下標*/
		int n, min;
		min = d[0];
		for (int i = 1; i < 5; i++)
		{
			if (d[i] <= min)
				n = i; //記錄最小值的下標

			min = d[n];//更新最小值
		}
		/*輸出中獎者*/
		cout << name[n + 1] << endl;
	}

}