PAT 乙级 1014题(为什么有测试点不对,求助)

题目:福尔摩斯的约会

大侦探福尔摩斯接到一张奇怪的字条:

我们约会吧! 
3485djDkxh4hhGE 
2984akDfkkkkggEdsb 
s&hgsfdk 
d&Hyscvnm

大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间星期四 14:04,因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母 D,代表星期四;第 2 对相同的字符是 E ,那是第 5 个英文字母,代表一天里的第 14 个钟头(于是一天的 0 点到 23 点由数字 0 到 9、以及大写字母 AN 表示);后面两字符串第 1 对相同的英文字母 s 出现在第 4 个位置(从 0 开始计数)上,代表第 4 分钟。现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。

输入格式:

输入在 4 行中分别给出 4 个非空、不包含空格、且长度不超过 60 的字符串。

输出格式:

在一行中输出约会的时间,格式为 DAY HH:MM,其中 DAY 是某星期的 3 字符缩写,即 MON 表示星期一,TUE 表示星期二,WED 表示星期三,THU 表示星期四,FRI 表示星期五,SAT 表示星期六,SUN 表示星期日。题目输入保证每个测试存在唯一解。

输入样例:

3485djDkxh4hhGE 
2984akDfkkkkggEdsb 
s&hgsfdk 
d&Hyscvnm

输出样例:

THU 14:04

解题思路:

        先设置了一个函数用于判断是否放入的两个字符是相同的。再开始寻找复合条件的输出数据1、数据2、数据3,并对其进行输出,输出数据1的时候采用switch语句来进行判断输出何种语句,输出数据2的时候需要进行判断是位于0~9还是A~N的情况再进行输出,输出数据3的时候需要判断是<10还是>10,如果<10就需要对高位进行补位的操作。

注意:

        ①输出部分1:其输出字符是位于A~N;

        ②输出部分2:其输出字符是位于0~9或A~N;

        ③输出的时候如果输出的时钟或分钟是小于10的,就必须在高位上补0,例如:8:2要写成08:02 。

        ④输出的数据其类型必须是char型(输出数据1和数据2)

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

//判断字符串对应位置是否相同
bool is_string_same(char a,char b)
{
	if(a != b)
	{
		return false;
	}
	else
	{
		return true;
	}
}

int main()
{
	string str1,str2,str3,str4;      //用于存放字符串
	cin>>str1;
	cin>>str2;
	cin>>str3;
	cin>>str4;
	char answer1=0;    //用于记录数据1
	char answer2=0;    //用于记录数据2
	int answer3=0;      //用于记录数据3
	int num=0;    //用于记录str1与str2相同的字符个数

	//找数据1、2
	for(int i=0;;i++)
	{
		if(str1[i] == NULL || str2[i] == NULL)    //当遍历完整个字符串依旧没有找到对应的字符就需要退出
		{
			return 0;
		}
		if(is_string_same(str1[i],str2[i]) && str1[i] >= 'A' && str1[i] <= 'N')     //找到字符串1、2中第一个相同的字符,且这个字符是A~G
		{
			num++;    //记录此时是第几次相同
			if(num == 1)     //第一次相同
			{
				answer1 = str1[i];
			}
			else      //第二次相同
			{
				if(is_string_same(str1[i],str2[i]) && ((str1[i] >= 'A' && str1[i] <= 'N') || (str1[i] >= '0' && str1[i] <= '9')))     //找到字符串1、2中第二个相同的字符,且这个字符是A~N或数字0~9)
				{
					answer2 = str1[i];
					break;     //找到两次相同的字符,退出循环
				}
			}
		}
	}

	//找数据3
	for(int i=0;;i++)
	{
		if(str3[i] == NULL || str4[i] == NULL)    //当遍历完整个字符串依旧没有找到对应的字符就需要退出
		{
			return 0;
		}
		if(is_string_same(str3[i],str4[i]) && ((str3[i] >= 'a' && str3[i] <= 'z') || (str3[i] >= 'A' && str3[i] <= 'Z')))     //找到字符串3、4中字符相同的位置,并且这个字符必须是小写字母
		{
			answer3 = i;
			break;
		}
	}

	//输出1
	switch((int)(answer1-65) % 7)
	{
		case 0:cout<<"MON"<<" ";break;
		case 1:cout<<"TUE"<<" ";break;
		case 2:cout<<"WED"<<" ";break;
		case 3:cout<<"THU"<<" ";break;
		case 4:cout<<"FRI"<<" ";break;
		case 5:cout<<"SAT"<<" ";break;
		case 6:cout<<"SUN"<<" ";break;
	}

	//输出2
	if(answer2 - 48 < 10)   //表示B是0~9,需要输出0_
	{
		cout<<"0"<<answer2-48<<":";
	}
	else    //表示B是A~N中的数
	{
		cout<<answer2-55<<":";
	}

	//输出3
	if(answer3 < 10)    //如果<10就要补0
	{
		cout<<"0"<<answer3;
	}
	else
	{
		cout<<answer3;
	}
	system("pause");
	return 0;
}

  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值