PAT-BASIC 1031-1035

本文深入解析了PAT竞赛中的经典算法题目,包括身份证校验、挖掘机技术比拼、旧键盘打字效果模拟、有理数四则运算以及排序算法的识别与实现。通过对这些题目的详细分析,展示了算法设计与实现的技巧,适合准备参加PAT竞赛或提升算法能力的学习者。

1031 查验身份证 (15分)

一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:

首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:

Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2     

现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。

输入格式:

输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。

输出格式:

按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed

输入样例1:

4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X          

输出样例1:

12010X198901011234
110108196711301866
37070419881216001X          

输入样例2:

2
320124198808240056
110108196711301862         

输出样例2:

All passed

分析

挺简单的一道题目,但是犯了一个很基础的错误,导致通过两个测试点,找了半天错误。。。在注释中已说明

Code

#include <iostream>
using namespace std;
int quan[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int M[11]={1,0,10,9,8,7,6,5,4,3,2};

bool chayan(string s){
	int sum=0;
	for(int i=0;i<17;i++){
			if((s[i] < '0' || s[i] > '9')) return false;
			sum+=(s[i]-'0')*quan[i];
		}
//	if(s[17]=='X') s[17]=10;  s[17]只能存放一位。。。 
//	return M[sum%11]==s[17];
	int temp = (s[17] == 'X') ? 10 : (s[17] - '0');
	return M[sum%11] == temp;
}


int main(){	
	int N;
	int flag=0;
	cin>>N;
	string s;
	for(int i=0;i<N;i++){
		cin>>s;
		if(!chayan(s)){
			//if(s[17]=='10') s[17]='X';
			cout<<s<<endl;
			flag = 1;
		}
	}
	if(flag==0) cout<<"All passed";
	return 0;
} 

1032 挖掘机技术哪家强 (20分)

为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。

输入格式:

输入在第 1 行给出不超过 105 的正整数 N,即参赛人数。随后 N 行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从 1 开始连续编号)、及其比赛成绩(百分制),中间以空格分隔。

输出格式:

在一行中给出总得分最高的学校的编号、及其总分,中间以空格分隔。题目保证答案唯一,没有并列。

输入样例:

6
3 65
2 80
1 100
2 70
3 40
3 0         

输出样例:

2 150

Code

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

int main(){
	int N,num,score=0;
	cin>>N;
	vector<int> v(N+1);
	for(int i=0;i<N;i++){
		cin>>num>>score;
		v[num]+=score;
	}
	int maxscore=v[1];
	int maxnum=1;
	for(int i=2;i<=N;i++){
		if(maxscore<v[i]){
			maxscore=v[i];
			maxnum=i;
		} 
	}
	cout<<maxnum<<" "<<maxscore;
	return 0;
}

1033 旧键盘打字 (20分)

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?

输入格式:

输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过 105 个字符的串。可用的字符包括字母 [a-z, A-Z]、数字 0-9、以及下划线 _(代表空格)、,.-+(代表上档键)。题目保证第 2 行输入的文字串非空。

注意:如果上档键坏掉了,那么大写的英文字母无法被打出。

输出格式:

在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。

输入样例:

7+IE.
7_This_is_a_test.       

输出样例:

_hs_s_a_tst

Code

#include<iostream>
#include<cctype>
using namespace std;
int main(){
	string bad,out;
	//cin>>bad>>out; 一个测试点错误19分
	getline(cin,bad);
	getline(cin,out);
	int length=out.length();
	for(int i=0;i<length;i++){
		if(bad.find(toupper(out[i]))!=string::npos) continue;
		if(isupper(out[i])&&bad.find('+')!=string::npos) continue;
		cout<<out[i];
	}
	return 0;
}

1034 有理数四则运算 (20分)

本题要求编写程序,计算 2 个有理数的和、差、积、商。

输入格式:

输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为 0。

输出格式:

分别在 4 行中按照 有理数1 运算符 有理数2 = 结果 的格式顺序输出 2 个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式 k a/b,其中 k 是整数部分,a/b 是最简分数部分;若为负数,则须加括号;若除法分母为 0,则输出 Inf。题目保证正确的输出中没有超过整型范围的整数。

输入样例 1:

2/3 -4/2          

输出样例 1:

2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)          

输入样例 2:

5/3 0/6          

输出样例 2:

1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf

Code

int * int 范围会不够 会发生错误 故用long long

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

int gcd(long long a, long long b) {
	return b == 0 ? a : gcd(b, a % b);
}

void huajian(long long a1, long long a2) {
	long long b = 0;
	if (a1 > 0) {
		if (a2 == 1)
			cout << a1;
		else if(a1 > a2) {
			b = a1 / a2;
			a1 -= a2 * b;
			cout << b << " " << a1 << "/" << a2;
		} else {
			cout << a1 << "/" << a2;
		}
	} else if (a1 == 0) {
		cout << 0;
	} else {
		//a1<0
		if (a2 == 1)
			cout << "(" << a1 << ")";
		else if (-1 * a1 > a2) {
			b = a1 / a2;
			a1 = (-1 * a1) % a2;
			cout << "(" << b << " " << a1 << "/" << a2 << ")";
		} else {
			cout << "(" << a1 << "/" << a2 << ")";
		}
	}
}

void add(long long a1, long long a2, long long b1, long long b2) {
	huajian(a1, a2);
	cout << " " << "+" << " ";
	huajian(b1, b2);
	cout << " " << "=" << " ";;
	long long c1 = a1 * b2 + a2 * b1;
	long long c2 = a2 * b2;
	long long c = abs(gcd(c1, c2));
	c1 /= c;
	c2 /= c;
	huajian(c1, c2);
}


void sub(long long a1, long long a2, long long b1, long long b2) {
	huajian(a1, a2);
	cout << " " << "-" << " ";
	huajian(b1, b2);
	cout << " " << "=" << " ";;
	long long c1 = a1 * b2 - a2 * b1;
	long long c2 = a2 * b2;
	long long c = abs(gcd(c1, c2));
	c1 /= c;
	c2 /= c;
	huajian(c1, c2);
}


void mult(long long a1, long long a2, long long b1, long long b2) {
	huajian(a1, a2);
	cout << " " << "*" << " ";
	huajian(b1, b2);
	cout << " " << "=" << " ";;
	long long c1 = a1 * b1;
	long long c2 = a2 * b2;
	long long c = abs(gcd(c1, c2));
	c1 /= c;
	c2 /= c;
	huajian(c1, c2);
}

void div(long long a1, long long a2, long long b1, long long b2) {
	huajian(a1, a2);
	cout << " " << "/" << " ";
	huajian(b1, b2);
	cout << " " << "=" << " ";
	if (!b1) {
		cout << "Inf";
		return;
	} else if (b1 < 0) {
		long long c1 = -1 * a1 * b2;
		long long c2 = -1 * a2 * b1;
		long long c = abs(gcd(c1, c2));
		c1 /= c;
		c2 /= c;
		huajian(c1, c2);
	} else {
		long long c1 = a1 * b2;
		long long c2 = a2 * b1;
		long long c = abs(gcd(c1, c2));
		c1 /= c;
		c2 /= c;
		huajian(c1, c2);
	}
}
int main() {
	long long a1, a2, b1, b2;
	scanf("%lld/%lld %lld/%lld", &a1, &a2, &b1, &b2);
	long long num_1 = abs(gcd(a1, a2));
	a1 /= num_1;
	a2 /= num_1;
	long long num_2 = abs(gcd(b1, b2));
	b1 /= num_2;
	b2 /= num_2;

	add(a1, a2, b1, b2);
	cout << endl;
	sub(a1, a2, b1, b2);
	cout << endl;
	mult(a1, a2, b1, b2);
	cout << endl;
	div(a1, a2, b1, b2);
	return 0;
}

1035 插入与归并 (25分)

根据维基百科的定义:

插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。

归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列。

现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?

输入格式:

输入在第一行给出正整数 N (≤100);随后一行给出原始序列的 N 个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。

输出格式:

首先在第 1 行中输出Insertion Sort表示插入排序、或Merge Sort表示归并排序;然后在第 2 行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行首尾不得有多余空格。

输入样例 1:

10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0      

输出样例 1:

Insertion Sort
1 2 3 5 7 8 9 4 6 0         

输入样例 2:

10
3 1 2 8 7 5 9 4 0 6
1 3 2 8 5 7 4 9 0 6       

输出样例 2:

Merge Sort
1 2 3 8 4 5 7 9 0 6       

Code

代码来自柳神

这题的重难点是判断排序的方式和执行下一步

插入算法的话,判断的点在于 如果是插入的话,那么前面一段数一定是有序的,而后面未处理的数与原数列相同

本题非一即二 如果不是插入 那么肯定是归并

归并算法 每次取相邻的组合 举个栗子:

3 1 2 8 7 5 9 4 0 6(未排序)

(1 3)(2 8) (5 7) (4 9)(0 6) 经过第一次排序

(1 2 3 8)(4 5 7 9)(0 6)经过第二次排序,这里要注意的是剩下的数也要排序

#include <iostream>
#include <algorithm>
using namespace std;
int main() {
	int n, a[100], b[100], i, j;
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	for (int i = 0; i < n; i++)
		cin >> b[i];
	for (i = 0; i < n - 1 && b[i] <= b[i + 1]; i++);
	for (j = i + 1; a[j] == b[j] && j < n; j++);
	if (j == n) {
		cout << "Insertion Sort" << endl;
		sort(a, a + i + 2);
	} else {
		cout << "Merge Sort" << endl;
		int k = 1, flag = 1;
		while(flag) {
			flag = 0;
			for (i = 0; i < n; i++) {
				if (a[i] != b[i])
					flag = 1;
			}
			k = k * 2;
			for (i = 0; i < n / k; i++)
				sort(a + i * k, a + (i + 1) * k);
			sort(a + n / k * k, a + n);
		}
	}
	for (j = 0; j < n; j++) {
		if (j != 0) printf(" ");
		printf("%d", a[j]);
	}
	return 0;
}
内容概要:本文是一篇关于使用RandLANet模型对SensatUrban数据集进行点云语义分割的实战教程,系统介绍了从环境搭建、数据准备、模型训练与测试到精度评估的完整流程。文章详细说明了在Ubuntu系统下配置TensorFlow 2.2、CUDA及cuDNN等深度学习环境的方法,并指导用户下载和预处理SensatUrban数据集。随后,逐步讲解RandLANet代码的获取与运行方式,包括训练、测试命令的执行与参数含义,以及如何监控训练过程中的关键指标。最后,教程涵盖测试结果分析、向官方平台提交结果、解读评估报告及可视化效果等内容,并针对常见问题提供解决方案。; 适合人群:具备一定深度学习基础,熟悉Python编程和深度学习框架,从事计算机视觉或三维点云相关研究的学生、研究人员及工程师;适合希望动手实践点云语义分割项目的初学者与进阶者。; 使用场景及目标:①掌握RandLANet网络结构及其在点云语义分割任务中的应用;②学会完整部署一个点云分割项目,包括数据处理、模型训练、测试与性能评估;③为参与相关竞赛或科研项目提供技术支撑。; 阅读建议:建议读者结合提供的代码链接和密码访问完整资料,在本地或云端环境中边操作边学习,重点关注数据格式要求与训练参数设置,遇到问题时参考“常见问题与解决技巧”部分及时排查。
内容概要:本文详细介绍了三相异步电机SVPWM-DTC(空间矢量脉宽调制-直接转矩控制)的Simulink仿真实现方法,结合DTC响应快与SVPWM谐波小的优点,构建高性能电机控制系统。文章系统阐述了控制原理,包括定子磁链观测、转矩与磁链误差滞环比较、扇区判断及电压矢量选择,并通过SVPWM技术生成固定频率PWM信号,提升系统稳态性能。同时提供了完整的Simulink建模流程,涵盖电机本体、磁链观测器、误差比较、矢量选择、SVPWM调制、逆变器驱动等模块的搭建与参数设置,给出了仿真调试要点与预期结果,如电流正弦性、转矩响应快、磁链轨迹趋圆等,并提出了模型优化与扩展方向,如改进观测器、自适应滞环、弱磁控制和转速闭环等。; 适合人群:电气工程、自动化及相关专业本科生、研究生,从事电机控制算法开发的工程师,具备一定MATLAB/Simulink和电机控制理论基础的技术人员。; 使用场景及目标:①掌握SVPWM-DTC控制策略的核心原理与实现方式;②在Simulink中独立完成三相异步电机高性能控制系统的建模与仿真;③通过仿真验证控制算法有效性,为实际工程应用提供设计依据。; 阅读建议:学习过程中应结合文中提供的电机参数和模块配置逐步搭建模型,重点关注磁链观测、矢量选择表和SVPWM调制的实现细节,仿真时注意滞环宽度与开关频率的调试,建议配合MATLAB官方工具箱文档进行参数校准与结果分析。
已经博主授权,源码转载自 https://pan.quark.cn/s/bf1e0d5b9490 本文重点阐述了Vue2.0多Tab切换组件的封装实践,详细说明了通过封装Tab切换组件达成多Tab切换功能,从而满足日常应用需求。 知识点1:Vue2.0多Tab切换组件的封装* 借助封装Tab切换组件,达成多Tab切换功能* 支持tab切换、tab定位、tab自动化仿React多Tab实现知识点2:TabItems组件的应用* 在index.vue文件中应用TabItems组件,借助name属性设定tab的标题* 通过:isContTab属性来设定tab的内容* 能够采用子组件作为tab的内容知识点3:TabItems组件的样式* 借助index.less文件来设定TabItems组件的样式* 设定tab的标题样式、背景色彩、边框样式等* 使用animation达成tab的切换动画知识点4:Vue2.0多Tab切换组件的构建* 借助运用Vue2.0框架,达成多Tab切换组件的封装* 使用Vue2.0的组件化理念,达成TabItems组件的封装* 通过运用Vue2.0的指令和绑定机制,达成tab的切换功能知识点5:Vue2.0多Tab切换组件的优势* 达成多Tab切换功能,满足日常应用需求* 支持tab切换、tab定位、tab自动化仿React多Tab实现* 能够满足多样的业务需求,具备良好的扩展性知识点6:Vue2.0多Tab切换组件的应用场景* 能够应用于多样的业务场景,例如:管理系统、电商平台、社交媒体等* 能够满足不同的业务需求,例如:多Tab切换、数据展示、交互式操作等* 能够与其它Vue2.0组件结合运用,达成复杂的业务逻辑Vue2.0多Tab切换组件的封装实例提供了...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值