PAT每日三题

1104 天长地久

分数 20

作者 陈越

单位 浙江大学

“天长地久数”是指一个 K 位正整数 A,其满足条件为:A 的各位数字之和为 m,A+1 的各位数字之和为 n,且 m 与 n 的最大公约数是一个大于 2 的素数。本题就请你找出这些天长地久数。

输入格式:

输入在第一行给出正整数 N(≤5),随后 N 行,每行给出一对 K(3<K<10)和 m(1<m<90),其含义如题面所述。

输出格式:

对每一对输入的 K 和 m,首先在一行中输出 Case X,其中 X 是输出的编号(从 1 开始);然后一行输出对应的 n 和 A,数字间以空格分隔。如果解不唯一,则每组解占一行,按 n 的递增序输出;若仍不唯一,则按 A 的递增序输出。若解不存在,则在一行中输出 No Solution

输入样例:

2
6 45
7 80

输出样例:

Case 1
10 189999
10 279999
10 369999
10 459999
10 549999
10 639999
10 729999
10 819999
10 909999
Case 2
No Solution
#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;

//判断为素数
bool is_prime(int n) {
	if (n < 2) {
		return false;
	}
	else if (n == 2) {
		return true;
	}
	else if (n % 2 == 0) {
		return false;
	}
	else {
		for (int i = 3; i <= sqrt(n); i += 2) {
			if (n % i == 0) {
				return false;
			}
		}
		return true;
	}
}


int fun(int t) {
	string s = to_string(t);
	int c = 0;
	for (int i = 0; i < s.size(); i++) {
		//加上直接转为数字
		c += s[i] - '0';
	}
	return c;
}

//求公约数
int fun2(int a, int b) {
	int c = a % b;
	if (c == 0) {
		return b;
	}
	else {
		return fun2(b, c);
	}
}

//判断最大公约数是否为>2的素数
bool fun1(int a, int b) {
	int t = fun2(a, b);
	if (t > 2 && is_prime(t)) {
		return true;
	}
	else {
		return false;
	}
}

struct r {
	long long p;
	long long q;
};

bool compare(r& r1, r& r2) {
	if (r1.p == r2.p) {
		return r1.q < r2.q;
	}
	return r1.p < r2.p;
}



int main() {

	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		int a, b;
		cin >> a >> b;
		cout << "Case " << i + 1 << endl;
		int c = 0;
		long long start = pow(10, a - 1);
		long long end = pow(10, a);
		long long j = start;
		vector<r> arr;
		//优化代码速度找尾数为9的
		while (j % 100 != 99 && j < end) {
			j++;
		}
		for (j; j < end; j+=100) {
			//求取i的位数和
			
			long long t1 = fun(j);
			if (t1 == b) {
				long long t2 = fun(j + 1);
				//判断t1,t2最大公约数为>2的素数
				if (fun1(t1, t2)) {
					arr.push_back({ t2,j });
					//cout << t2 <<" "<< j << endl;
					c++;
				}
			}
		}
		sort(arr.begin(), arr.end(), compare);
		if (c == 0) {
			cout << "No Solution" << endl;
		}
		else {
			for (int i = 0; i < arr.size(); i++) {
				cout << arr[i].p << " " << arr[i].q << endl;
			}
		}

	}


	return 0;
}

1103 缘分数

分数 20

作者 陈越

单位 浙江大学

所谓缘分数是指这样一对正整数 a 和 b,其中 a 和它的小弟 a−1 的立方差正好是另一个整数 c 的平方,而 c 正好是 b 和它的小弟 b−1 的平方和。例如 83−73=169=132,而 13=32+22,于是 8 和 3 就是一对缘分数。

给定 a 所在的区间 [m,n],是否存在缘分数?

输入格式:

输入给出区间的两个端点 0<m<n≤25000,其间以空格分隔。

输出格式:

按照 a 从小到大的顺序,每行输出一对缘分数,数字间以空格分隔。如果无解,则输出 No Solution

输入样例 1:

8 200

输出样例 1:

8 3
105 10

输入样例 2:

9 100

输出样例 2:

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

int main() {

	int a, b;
	cin >> a >> b;
	int f = 0;
	for (int i = a; i <= b; i++) {
		long long c = i * i * i - (i - 1) * (i - 1) * (i - 1);
		int t = sqrt(c);
		if (t * t == c) {
			int p = t;
			for (int j = 2; j <= sqrt(p)+1; j++) {
				if (j * j + (j - 1) * (j - 1)  == p) {
					cout << i << " " << j << endl;
					f++;
				}
			}
		}
	}
	if (f == 0) {
		cout << "No Solution" << endl;
	}



	return 0;
}

1102 教超冠军卷

分数 20

作者 陈越

单位 浙江大学

“教育超市”是拼题 A 系统的一个衍生产品,发布了各种试卷和练习供用户选购。在试卷列表中,系统不仅列出了每份试卷的单价,还显示了当前的购买人次。本题就请你根据这些信息找出教育超市所有试卷中的销量(即购买人次)冠军和销售额冠军。

输入格式:

输入首先在第一行中给出一个正整数 N(≤104),随后 N 行,每行给出一份卷子的独特 ID (由小写字母和数字组成的、长度不超过8位的字符串)、单价(为不超过 100 的正整数)和购买人次(为不超过 106 的非负整数)。

输出格式:

在第一行中输出销量冠军的 ID 及其销量,第二行中输出销售额冠军的 ID 及其销售额。同行输出间以一个空格分隔。题目保证冠军是唯一的,不存在并列。

输入样例:

4
zju007 39 10
pku2019 9 332
pat2018 95 79
qdu106 19 38

输出样例:

pku2019 332
pat2018 7505
/* 1102 教超冠军卷 */
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

struct goods {
	string id;
	int price;
	int count;
	long long sum;
};

bool compare(goods& g1, goods& g2) {
	return g1.count > g2.count;
}

bool compare1(goods& g1, goods& g2) {
	return g1.sum > g2.sum;
}


int main() {

	int n;
	cin >> n;
	vector<goods> arr(n);
	for (int i = 0; i < n; i++) {
		cin >> arr[i].id >> arr[i].price >> arr[i].count;
		arr[i].sum = arr[i].price * arr[i].count;
	}
	sort(arr.begin(), arr.end(), compare);
	cout << arr[0].id <<" " << arr[0].count << endl;
	sort(arr.begin(), arr.end(), compare1);
	cout << arr[0].id <<" " << arr[0].sum;



	return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值