嘉宾与幸运中奖者

今天有同学做菊花厂的校招机试题遇到这个问题。

题目要求

  • 输入一个包含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;
	}

}
原文地址:https://www.cnblogs.com/j-c-y/p/13443087.html