PAT乙级 1012 数字分类 (20分) & 1013 数素数 (20分) & 1014 福尔摩斯的约会 (20分) & 1014 福尔摩斯的约会 (20分)

1012 数字分类 (20分)

给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字:

  • A​1​​ = 能被 5 整除的数字中所有偶数的和;
  • A​2​​ = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n​1​​−n​2​​+n​3​​−n​4​​⋯;
  • A​3​​ = 被 5 除后余 2 的数字的个数;
  • A​4​​ = 被 5 除后余 3 的数字的平均数,精确到小数点后 1 位;
  • A​5​​ = 被 5 除后余 4 的数字中最大数字。

输入格式:

每个输入包含 1 个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N,随后给出 N 个不超过 1000 的待分类的正整数。数字间以空格分隔。

输出格式:

对给定的 N 个正整数,按题目要求计算 A​1​​~A​5​​ 并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。

若其中某一类数字不存在,则在相应位置输出 N

不难但是没看到数字不存在的情况所以重新改了一遍,审题!

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

int A1(vector<int> v)
{
	int temp = 0,flag=0;
	for (int i = 0; i < v.size(); i++)
	{
		if (v[i] % 5 == 0 && v[i] % 2 == 0)
		{
			temp += v[i];
			flag++;
		}
	}
	if (flag == 0)
		cout << "N" << " ";
	else
		cout << temp << " ";
	return 0;
}

int A2(vector<int> v)
{
	int temp = 0, ch = 1,flag=0;
	for (int i = 0; i < v.size(); i++)
	{
		if (v[i] % 5 == 1)
		{
			if (ch % 2 == 1)
			{
				temp += v[i];
				ch++; flag++;
			}
			else
			{
				temp -= v[i];
				ch++; flag++;
			}
		}
	}
	if (flag == 0)
		cout << "N" << " ";
	else
		cout << temp << " ";
	return 0;
}

int A3(vector<int> v)
{
	int temp = 0,flag=0;
	for (int i = 0; i < v.size(); i++)
	{
		if (v[i] % 5 == 2)
		{
			temp++;
			flag++;
		}
	}
	if (flag == 0)
		cout << "N" << " ";
	else
		cout << temp << " ";
	return 0;
}

float A4(vector<int> v)
{
	float temp = 0;
	float ch = 0;
	int flag = 0;
	for (int i = 0; i < v.size(); i++)
	{
		if (v[i] % 5 == 3)
		{
			temp += v[i];
			ch++;
			flag++;
		}
	}
	if (flag != 0)
		printf("%.1f ", temp / ch);
	else
		cout << "N" << " ";
	return 0;
}

float A5(vector<int> v)
{
	float temp = 0,flag=0;
	for (int i = 0; i < v.size(); i++)
	{
		if (v[i] % 5 == 4)
			if (v[i] > temp)
			{
				temp = v[i];
				flag++;
			}
	}
	if (flag == 0)
		cout << "N";
	else
		cout << temp;
	return 0;
}

int main()
{
	int sum = 0;
	cin >> sum;
	vector<int> v;
	for (int i = 0; i < sum; i++)
	{
		int temp = 0;
		cin >> temp;
		v.push_back(temp);
	}
	A1(v);
	A2(v);
	A3(v);
	A4(v);
	A5(v);

	return 0;
}

1013 数素数 (20分)

令 P​i​​ 表示第 i 个素数。现任给两个正整数 M≤N≤10​4​​,请输出 P​M​​ 到 P​N​​ 的所有素数。

输入格式:

输入在一行中给出 M 和 N,其间以空格分隔。

输出格式:

输出从 P​M​​ 到 P​N​​ 的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。

有一个测试用例没过,不知道有什么问题,要是有大佬看到了望指教

#include<iostream>
#include<vector>
#include<string>
#include<math.h>
using namespace std;
bool sushu(int n)//判断素数
{
	if (n == 1)
		return true;
	if (n == 2)
		return true;
	for (int i = 2; i < sqrt(n) + 1; i++)
	{
		if (n % i == 0)
			return false;
	}
	return true;
}
int main()
{
	int a = 0, b = 0,temp=0,temp1=1;//temp1表示是输出的第几个数字,用于输出的格式管理
	cin >> a >> b;
	vector<int> v;

	for (int i = 1; i < 100000; i++)//先找到b+1个素数,存入vector
	{
		if (sushu(i))
		{
			if (temp != b + 1)
			{
				temp++;
				v.push_back(i);
			}
		}
	}
	for (int i = a; i <= b; i++)//输出从a到b的数据
	{
		if (temp1 % 10==0)
		{
			cout << v[i];
			temp1++;
			cout << "\n";
		}
		else if (i == b)
		{
			cout << v[i];
			break;
		}
		else
		{
			cout << v[i] << " ";
			temp1++;
		}
	}
	return 0;
}

1014 福尔摩斯的约会 (20分)

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

输入格式:

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

输出格式:

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

第一个相同需要定位在A~G中,否则例子4错误,

第二个相同需要定位在a~n中,否则就要3例子错误,

第二个例子还是没有搞明白为什么错

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
	string a, b, c, d;
	int flag = 0,hh=0,mm=0;
	cin >> a >> b >> c >> d;
	for (int i = 0; i < 60; i++)
	{
		if (a[i] == b[i] && flag == 1 && ((a[i]>='0' && a[i]<='9')||((a[i] >= 'A' && a[i] <= 'N') || (a[i] >= 'a' && a[i] <= 'n'))))//第二个相同
		{
			
			if (a[i] <= '9')
				hh = a[i] - '0';
			if (a[i] >= 'A')
				hh = a[i] - 'A' + 10;
			break;
		}
		if (a[i] == b[i] && (a[i] >= 'A' && a[i]<='G') && flag==0)//第一个相同
		{
			flag = 1;//已经检测到第一个相同的flag
			if (a[i] == 'A')
				cout << "MON ";
			if (a[i] == 'B')
				cout << "TUE ";
			if (a[i] == 'C')
				cout << "WED ";
			if (a[i] == 'D')
				cout << "THU ";
			if (a[i] == 'E')
				cout << "FRI ";
			if (a[i] == 'F')
				cout << "SAT ";
			if (a[i] == 'G')
				cout << "SUN ";
		}
	}
	for(int i = 0; i < 60; i++)//输出分钟
	{
		if (c[i] == d[i] && ((c[i] >= 'A' && c[i]<='Z')||(c[i]>='a'&&c[i]<='z')))
		{
			mm = i;
			break;
		}
	}
	printf("%02d:%02d",hh, mm);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38386991/article/details/104612489