PAT 中国大学MOOC-陈越、何钦铭-数据结构-起步能力自测题 题解
--------------------------------------------------------------------------------
题目传送门
PAT起步能力自测题
--------------------------------------------------------------------------------
序
初次学习PAT,可以先从本章小测试开始,检验一下自己的知识储备,是否达到了对应的要求,测试总体上分为两个部分,前3题对应的是PAT乙级考试的部分,后2题对应的是PAT甲级考试的部分。总体上说,乙级考试更加侧重于基础,而甲级考试会增加数据结构的部分。如果你对于前3题,能比较轻松的达到满分,则可以尝试乙级考试的备考训练了,当然了,如果你能力很强,5道题也能轻松拿满,那么,不妨直接备考甲级考试吧!
--------------------------------------------------------------------------------
更多详见>>
OJ题解系列 目录导航帖
--------------------------------------------------------------------------------
自测-1 打印沙漏 (20 分)
算法标签: 模拟
#include<bits/stdc++.h>
using namespace std;
int main(){
int N;
char c;
cin >> N >> c;
double n = sqrt((1+N)*1.0/2.0);
int maxn = int(n);
int rest = N -(2*maxn*maxn-1);
for(int i=n;i>0;i--){
for(int j=0;j<(2*maxn-2*i)/2;j++){
printf(" ");
}
for(int j=0;j<2*i-1;j++){
printf("%c",c);
}
printf("\n");
}
for(int i=2;i<=n;i++){
for(int j=0;j<(2*maxn-2*i)/2;j++){
printf(" ");
}
for(int j=0;j<2*i-1;j++){
printf("%c",c);
}
printf("\n");
}
cout << rest << endl;
return 0;
}
自测-2 素数对猜想 (20 分)
算法标签: 数论 + 素数筛
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
int a[maxn]={1,1,0};
int N;
int b[maxn];
int main(){
cin >> N;
for(int i=2;i<=N;i++){
if(!a[i]){
for(int j=2*i;j<=N;j+=i){
a[j] = 1;
}
}
}
int count = 0;
for(int i=0;i<=N;i++){
if(!a[i]){
b[count++] = i;
}
}
int result = 0;
for(int i=0;i<count-1;i++){
if(b[i+1]-b[i]==2){
result++;
}
}
cout << result << endl;
return 0;
}
自测-3 数组元素循环右移问题 (20 分)
算法标签: 模拟
#include<bits/stdc++.h>
using namespace std;
int N,M;
int main(){
cin >> N >> M;
M = M % N;
int a[N];
for(int i=0;i<N;i++){
cin >> a[i];
}
for(int i=0;i<N;i++){
if(i!=N-1){
cout << a[(N-M+i)%N] <<" ";
}else{
cout << a[(N-M+i)%N] << endl;
}
}
return 0;
}
自测-4 Have Fun with Numbers (20 分)
算法标签: 数论 + 高精
#include<bits/stdc++.h>
using namespace std;
struct bign{
int len;
int a[1005];
bign(){
memset(a,0,sizeof(a));
len = 0;
}
};
bign b1;
bign b2;
int n1[15];
int n2[15];
int main(){
string s;
cin >> s;
int len = s.size();
b1.len = len;
for(int i=len-1;i>=0;i--){
b1.a[len-i-1] = s[i]-'0';
}
int jw = 0;
for(int i=0;i<len;i++){
b2.a[i] = b1.a[i]*2 + jw;
jw = b2.a[i]/10;
b2.a[i] %= 10;
}
if(jw){
b2.a[len] = jw;
b2.len = b1.len+1;
}else{
b2.len = b1.len;
}
for(int i=0;i<b1.len;i++){
n1[b1.a[i]%10]++;
}
for(int i=0;i<b2.len;i++){
n2[b2.a[i]%10]++;
}
bool f = true;
for(int i=0;i<=9;i++){
if(n1[i] == n2[i]){
continue;
}else{
f = false;
break;
}
}
if(f){
printf("Yes\n");
}else{
printf("No\n");
}
for(int i=b2.len-1;i>=0;i--){
printf("%d",b2.a[i]);
}
printf("\n");
return 0;
}
自测-5 Shuffling Machine (20 分)
算法标签: 模拟
#include<bits/stdc++.h>
using namespace std;
int a[105];
int b[105];
int c[105];
string s = "SHCDJ";
int main(){
int K;
cin >> K;
for(int i=1;i<=54;i++){
a[i] = i;
}
for(int i=1;i<=54;i++){
cin >> b[i];
}
for(int i=1;i<=K;i++){
for(int j=1;j<=54;j++){
c[b[j]] = a[j];
}
for(int j=1;j<=54;j++){
a[j] = c[j];
}
}
for(int i=1;i<=54;i++){
cout << s[(a[i]-1)/13];
cout << (a[i]-1) % 13 + 1;
if(i!=54){
cout << " ";
}else{
cout << endl;
}
}
return 0;
}