PAT(乙级)2020年秋季考试 试题+代码

依然是做的仿真卷~

7-1 多二了一点 (15分)

若一个正整数有 2n 个数位,后 n 个数位组成的数恰好比前 n 个数位组成的数多 2,则称这个数字“多二了一点”。如 24、6668、233235 等都是多二了一点的数字。

给定任一正整数,请你判断它有没有多二了那么一点。

输入格式:

输入在第一行中给出一个正整数 N(≤ 1 0 1000 10^{1000} 101000)。

输出格式:

在一行中根据情况输出下列之一:

  • 如果输入的整数没有偶数个数位,输出 Error: X digit(s),其中 XN 的位数;
  • 如果是偶数位的数字,并且是多二了一点,输出 Yes: X - Y = 2,其中 X 是后一半数位组成的数,Y 是前一半数位组成的数;
  • 如果是偶数位的数字,但并不是多二了一点,输出 No: X - Y != 2,其中 X 是后一半数位组成的数,Y 是前一半数位组成的数。

输入样例 1:

233235

输出样例 1:

Yes: 235 - 233 = 2

输入样例 2:

5678912345

输出样例 2:

No: 12345 - 56789 != 2

输入样例 3:

2331235

输出样例 3:

Error: 7 digit(s)

代码

#include <iostream>

using namespace std;

int main()
{
	string s;
	cin >> s;
	if (s.length() % 2)
	{
		cout << "Error: " << s.length() << " digit(s)";
	}
	else
	{
		string s1 = s.substr(0, s.length() / 2), s2 = s.substr(s.length() / 2, s.length() / 2);
		// cout << s1 << "  " << s2;
		if (s1.substr(0, s1.length() - 1) == s2.substr(0, s2.length() - 1) && s1[s.length() - 1] == s2[s.length() - 1] - 2)
		{

			cout << "Yes: " << s2 << " - " << s1 << " = 2";
		}

		else if (s1.substr(0, s1.length() - 2) == s2.substr(0, s2.length() - 2) && stoi(s2.substr(s2.length() - 2, 2)) - stoi(s1.substr(s1.length() - 2, 2)) == 2)
		{
			cout << "Yes: " << s2 << " - " << s1 << " = 2";
		}
		else
		{
			cout << "No: " << s2 << " - " << s1 << " != 2";
		}
	}
	return 0;
}

7-2 数字之王 (20分)

给定两个正整数 N1<N2。把从 N1 到 N2 的每个数的各位数的立方相乘,再将结果的各位数求和,得到一批新的数字,再对这批新的数字重复上述操作,直到所有数字都是 1 位数为止。这时哪个数字最多,哪个就是“数字之王”。

例如 N1=1 和 N2=10 时,第一轮操作后得到 { 1, 8, 9, 10, 8, 9, 10, 8, 18, 0 };第二轮操作后得到 { 1, 8, 18, 0, 8, 18, 0, 8, 8, 0 };第三轮操作后得到 { 1, 8, 8, 0, 8, 8, 0, 8, 8, 0 }。所以数字之王就是 8。

本题就请你对任意给定的 N 1 < N 2 N_1<N_2 N1<N2 求出对应的数字之王。

输入格式:

输入在第一行中给出两个正整数 0 < N 1 < N 2 ≤ 1 0 3 0<N_1<N_2≤10^3 0<N1<N2103,其间以空格分隔。

输出格式:

首先在一行中输出数字之王的出现次数,随后第二行输出数字之王。例如对输入 1 10 就应该在两行中先后输出 68。如果有并列的数字之王,则按递增序输出。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

10 14

输出样例:

2
0 8

代码

#include <iostream>
#include <cmath>
#include <vector>
using namespace std;

long long ans[10];

long long qiuhe(long long x)
{
	long long sum = 0;
	while (x)
	{
		sum += x % 10;
		x /= 10;
	}
	return sum;
}
long long qiuhe2(long long x)
{
	long long sum = 1;
	while (x)
	{
		sum *= pow(x % 10, 3);
		x /= 10;
	}
	return sum;
}

int main()
{
	long long n1, n2, num[1003];
	cin >> n1 >> n2;
	for (long long i = 1; i <= n2 - n1 + 1; i++)
	{
		num[i] = n1 - 1 + i;
	}
	long long f = 0;
	for (long long i = 1; i <= n2 - n1 + 1; i++)
	{
		if (num[i] >= 10)
		{
			f = 1;
			break;
		}
	}
	while (f)
	{
		for (long long i = 1; i <= n2 - n1 + 1; i++)
		{
			if (num[i] >= 10)
			{
				num[i] = qiuhe(qiuhe2(num[i]));
			}
			else
				num[i] = qiuhe(pow(num[i], 3));
		}
		f = 0;
		for (long long i = 1; i <= n2 - n1 + 1; i++)
		{
			if (num[i] >= 10)
			{
				f = 1;
				break;
			}
		}
		// for (long long i = 1; i <= n2 - n1 + 1; i++)
		// {
		// 	cout << num[i] << " ";
		// }
		// cout << endl;
	}
	for (long long i = 1; i <= n2 - n1 + 1; i++)
		ans[num[i]]++;
	vector<long long> p;
	long long maxn = -1;
	for (long long i = 0; i <= 9; i++)
	{
		if (ans[i] > maxn)
		{
			p.clear();
			maxn = ans[i];
			p.push_back(i);
		}
		else if (ans[i] == maxn)
		{
			p.push_back(i);
		}
	}
	cout << maxn << endl;
	cout << p[0];
	for (long long i = 1; i < p.size(); i++)
	{
		cout << " " << p[i];
	}
	return 0;
}

7-3 如需挪车请致电 (20分)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8hpuX6oR-1606038655987)(https://images.ptausercontent.com/f29f986f-a871-4617-8fa7-e0cf4fe1d5d5.jpg)]

上图转自新浪微博。车主用一系列简单计算给出了自己的电话号码,即:

2/2=1、3+2=5、√9=3、√9=3、0%=0、叁=3、5−2=3、9/3=3、1×3=3、23=8、8/2=4,最后得到的电话号码就是 153 3033 3384。

本题就请你写个程序自动完成电话号码的转换,以帮助那些不会计算的人。

输入格式:

输入用 11 行依次给出 11 位数字的计算公式,每个公式占一行。这里仅考虑以下几种运算:加(+)、减(-)、乘(*)、除(/)、取余(%,注意这不是上图中的百分比)、开平方根号(sqrt)、指数(^)和文字(即 0 到 9 的全小写汉语拼音,如 ling 表示 0)。运算符与运算数之间无空格,运算数保证是不超过 1000 的非负整数。题目保证每个计算至多只有 1 个运算符,结果都是 1 位整数。

输出格式:

在一行中给出电话号码,数字间不要空格。

输入样例:

2/2
3+2
sqrt9
sqrt9
6%2
san
5-2
9/3
1*3
2^3
8/2

输出样例:

15330333384

代码

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

string t[11] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};

int check1(string s)
{
    for (int i = 0; i <= 9; i++)
    {
        if (s == t[i])
        {
            return i;
        }
    }
    return -1;
}

int main()
{
    for (int i = 0; i < 11; i++)
    {
        string s;
        cin >> s;
        if (check1(s) != -1)
        {
            cout << check1(s);
        }
        else
        {
            if (s[0] == 's')
            {
                cout << (int)(sqrt(stoi(s.substr(4, s.length() - 4))));
            }
            else
            {
                int f = -1;
                for (int i = 0; i < s.length(); i++)
                {
                    if (!isdigit(s[i]))
                    {
                        f = i;
                        break;
                    }
                }
                if (f == -1)
                {
                    cout << s;
                }
                else
                {
                    int t1 = stoi(s.substr(0, f)), t2 = stoi(s.substr(f + 1, s.length() - f - 1));
                    switch (s[f])
                    {
                    case '^':
                        cout << pow(t1, t2);
                        break;
                    case '+':
                        cout << t1 + t2;
                        break;
                    case '-':
                        cout << t1 - t2;
                        break;
                    case '*':
                        cout << t1 * t2;
                        break;
                    case '/':
                        cout << t1 / t2;
                        break;
                    case '%':
                        cout << t1 % t2;
                        break;
                    }
                }
            }
        }
    }
    return 0;
}

7-4 胖达与盆盆奶 (20分)

panda.jpg

大熊猫,俗称“胖达”,会排队吃盆盆奶。它们能和谐吃奶的前提,是它们认为盆盆奶的分配是“公平”的,即:更胖的胖达能吃到更多的奶,等胖的胖达得吃到一样多的奶。另一方面,因为它们是排好队的,所以每只胖达只能看到身边胖达的奶有多少,如果觉得不公平就会抢旁边小伙伴的奶吃。

已知一只胖达每次最少要吃 200 毫升的奶,当另一份盆盆奶多出至少 100 毫升的时候,它们才能感觉到是“更多”了,否则没感觉。

现在给定一排胖达的体重,请你帮饲养员计算一下,在保持给定队形的前提下,至少应该准备多少毫升的盆盆奶?

输入格式:

输入首先在第一行给出正整数 n(≤ 1 0 4 10^4 104),为胖达的个数。随后一行给出 n 个正整数,表示 n 只胖达的体重(公斤)。每个数值是不超过 200 的正整数,数字间以空格分隔。

输出格式:

在一行中输出至少应该准备多少毫升的盆盆奶。

输入样例:

10
180 160 100 150 145 142 138 138 138 140

输出样例:

3000

样例解释:

盆盆奶的分配量顺序为:

400 300 200 500 400 300 200 200 200 300

代码

#include <iostream>

using namespace std;

long long kg[10001], a[10001], b[10001];

int main()
{
    ios::sync_with_stdio(false);
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> kg[i];
    }
    int t = 0, p = 201;
    for (int i = 0; i < n; i++)
    {
        if (kg[i] > p)
        {
            t++;
        }
        else if (kg[i] == p)
        {
            ;
        }
        else
        {
            t = 0;
        }
        a[i] = t;
        p = kg[i];
    }
    t = 0;
    p = 202;
    for (int i = n - 1; i >= 0; i--)
    {
        if (kg[i] > p)
        {
            t++;
        }
        else if (kg[i] == p)
        {
            ;
        }
        else
        {
            t = 0; 
        }
        b[i] = t;
        p = kg[i];
    }

    int ans = 0;

    for (int i = 0; i < n; i++)
    {
        ans = ans + max(a[i], b[i]) * 100 + 200;
    }
    cout << ans;
    return 0;
}

7-5 买地攻略 (25分)

数码城市有土地出售。待售的土地被划分成若干块,每一块标有一个价格。这里假设每块土地只有两块相邻的土地,除了开头和结尾的两块是只有一块邻居的。每位客户可以购买多块连续相邻的土地。

现给定这一系列土地的标价,请你编写程序,根据客户手头的现金量,告诉客户有多少种不同的购买方案。

输入格式:

输入首先在第一行给出两个正整数:N(≤ 1 0 4 10^4 104)为土地分割的块数(于是这些块从 1 到 N 顺次编号);M(≤ 1 0 9 10^9 109)为客户手中的现金量。

随后一行给出 N 个正整数,其中第 i 个数字就是第 i 块土地的标价。

题目保证所有土地的总价不超过 109。

输出格式:

在一行中输出客户有多少种不同的购买方案。请注意客户只能购买连续相邻的土地。

输入样例:

5 85
38 42 15 24 9

输出样例:

11

样例解释:

这 11 种不同的方案为:

38
42
15
24
9
38 42
42 15
42 15 24
15 24
15 24 9
24 9

代码

#include <iostream>

using namespace std;

int main()
{
	int n, m;
	cin >> n >> m;
	int a[10001], dq = 0, ge = 0, ans = 0, yb = 0;

	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
		if (dq + a[i] <= m)
		{
			ge++;
			dq += a[i];
			ans += ge;
		}
		else
		{
			while (1)
			{
				dq -= a[yb];
				ge--;
				++yb;
				if (dq + a[i] <= m)
					break;
			}
			ge++;
			dq += a[i];
			ans += ge;
		}
	}
	cout << ans;
	return 0;
}
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值