PAT乙级

目录

1001.3n+1猜想

1002.写出这个数 

1004.成绩排名

1086 就不告诉你

1087 有多少不同的值 (20分)

1091 N-自守数   还没写好 还没想过

1008 数组元素循环右移问题 (20分)  没想明白

1010 一元多项式求导 (25分) 

1011 A+B 和 C (15分)

1012 数字分类 (20分)

1016 部分A+B (15分)

1018 锤子剪刀布 (20分)



简单模拟  20题         字符串处理        17题   1         进制转换   3题              数学  4题              动态规划   2题

中级模拟  7题               散列                   11题              贪心          3题              排序  4题              链表         2题

水题         3题   √3         素数                   3题                查找          7题          stl     3题               其他         6题

11

X:没想明白

?:在想想

编号

标题

分类

简单模拟

1001 √

3n+1猜想​

简单模拟

1008

数组元素循环右移问题

简单模拟  X

1010

一元多项式求导

简单模拟

1011

A+B 和 C 

简单模拟

1012

 数字分类 

简单模拟 X

1016

部分A+B 

简单模拟

1018

锤子剪刀布 

简单模拟

1026

程序运行时间

简单模拟

1046

划拳

简单模拟

1053

住房空置率

简单模拟

1056

组合数的和

简单模拟

1061

判断题

简单模拟

1063

计算谱半径

简单模拟

1066

图像过滤

简单模拟

1068

万绿丛中一点红

简单模拟

1071

小赌怡情

简单模拟

1076

Wifi密码

简单模拟

1077

互评成绩计算

简单模拟

1088

三人行

简单模拟

1089

狼人杀-简单版

简单模拟

中级模拟

1050

螺旋矩阵

中级模拟

1055

集体照

排序+中级模拟

1058

选择题

中级模拟+常用stl

1060

爱丁顿数

中级模拟

1069

微博转发抽奖

中级模拟

1072

开学寄语

中级模拟+二分查找

1073

多选题常见计分法

中级模拟+常用stl

水题

1086

就不告诉你

水题(字符串string)(小技巧)

1087

有多少不同的值 

水题(set s.size s.insert)

1091

N-自守数

水题 X

字符串处理

1002 √

写出这个数 

字符串处理

1006

换个格式输出整数

字符串处理

1009

说反话

字符串处理

1014

福尔摩斯的约会

字符串处理

1021

个位数统计

字符串处理

1024

科学计数法

字符串处理

1027

打印沙漏

字符串处理

1031

查验身份证

字符串处理

1044

火星数字

进制转换+字符串处理

1048

数字加密

字符串处理

1052

卖个萌

字符串处理

1054

求平均值

字符串处理

1067

试密码

字符串处理

1074

宇宙无敌加法器

进制转换+字符串处理

1078

字符串压缩与解压

字符串处理

1081

检查密码

字符串处理

1084

外观数列

字符串处理

进制转换

1022

D进制的A+B

进制转换

1037

在霍格沃茨找零钱

进制转换

1057

数零壹

进制转换

散列

1005

继续(3n+1)猜想

散列

1029

旧键盘

散列

1033

旧键盘打字

散列

1038

统计同成绩学生

散列

1039

到底买不买

散列

1042

字符统计

散列

1043

输出PATest

散列

1047

编程团体赛

散列

1059

C语言竞赛

散列

1065

单身狗

散列+常用stl

1093

字符串A+B

散列

数学

1003

我要通过!

数学

1019

数字黑洞

数学

1049

数列的片段和

数学

1051

复数乘法

数学

贪心

1020

月饼

贪心

1023

组个最小数

贪心

1070

结绳

贪心

排序

1015

德才论

排序

1080

MOOC期终成绩

排序

1085

PAT单位排行

排序

1095

解码PAT准考证

排序

素数

1007

素数对猜想

素数

1013

数素数

素数

1094

谷歌的招聘

素数

查找

1004

成绩排名

查找元素

1028

人口普查

查找元素

1030

完美数列

二分查找、two pointers

1032

挖掘机技术哪家强

查找元素

1041

考试座位号

查找元素

1082

射击比赛

查找元素

1092

最好吃的月饼

查找元素

常用stl

1064

朋友数

常用stl

1083

是否存在相等的差

常用stl

1090

危险品装箱

常用stl

动态规划

1040

有几个PAT

动态规划

1045

快速排序

动态规划

链表

1025

反转链表

链表

1075

链表元素分类

链表

其他

1017

A除以B

大整数运算

1079

延迟的回文数

大整数运算

1035

插入与归并

暂无

1036

跟奥巴马一起编程

图形输出

1034

有理数四则运算

分数

1062

最简分数

分数

 

 

 

1001.3n+1猜想

PAT乙级_第1张图片

C语言版

#include
int main()
{
    int n,i;
    i=0;
    scanf("%d",&n);
    while(n!=1)
{
    i++;
    if(!(n%2))//(n%2)->=1 !(n%2)->n%2==0
    {
        n=n/2;
    }
    else
    {
        n=(3*n+1)/2;
    }
}
    printf("%d",i);
}

C++

#include 
using namespace std;
int main() {
int n, count = 0;
cin >> n;
while (n != 1) {
if (n % 2 != 0) n = 3 * n + 1;
n = n / 2;
count++;
}
cout << count;
return 0;
}

 

1002.写出这个数 

PAT乙级_第2张图片

我以C为主,C++参考,同时学习有些函数和概念。

代码多数是参考别人的。得多读点写法。

写一下这题过程中的问题,在写这个程序的时候,我一直在想如何输入一个数,让这个数中的每个数相加,我想写一个for循环,但是不知道如何去取这个数的边界值,所以到后面就想不出来了。

过程中就算是看了别人的代码,也出现了很多低级错误,还是得谨慎。

考查:字符串的转换,单个字符的输入,如何取一个数的百十个,字符串大小问题

问题:用C++来写是完全不会,很多东西也不懂为啥是这样,不过还好有万能的百度。即查即用。

#include包含C++的所有头文件

temp[s[i]-'0'].c_str()  解释 

https://blog.csdn.net/zhanghuaichao/article/details/53158332

PAT乙级_第3张图片

解释:string num = to_string(sum);

c++之to_string()函数

功能:

将数值转化为字符串。返回对应的字符串。

C

#include
int main()          //c=getchar() 没加括号 a[80]不够了 !=  sum/10%10
{
	int sum=0;
	char c,*a[]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
	while((c=getchar())!='\n')
	sum += c - '0';//c为字符串 比如输入1-49    0-48   
	if(sum/100)
	printf("%s ",a[sum/100]);
	if(sum/10)
	printf("%s ",a[sum/10%10]);
	printf("%s",a[sum%10]);
}

C++

#include 
#include 
using namespace std;
int main() {
	string s;//C++特有字符串 
	cin >> s;
	int sum = 0;
	string str[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi","ba", "jiu"};
	for (int i = 0; i < s.length(); i++)//字符串长度 
	sum += (s[i] - '0');
	string num = to_string(sum);//把sum-135 给 num;C++直接定义 
	for (int i = 0; i < num.length(); i++) {
	if (i != 0) cout << " ";//看题意不可能有0,小技巧 
	cout << str[num[i] - '0'];//数组中的数组,这样似乎更方便? 
}
	return 0;
}

#include
using namespace std;
int main(){
    string s;
    cin>>s;
    int sum=0;
    for(int i=0;i0?" ":"",temp[s[i]-'0'].c_str());
    return 0;
}

1004.成绩排名

PAT乙级_第4张图片

问题:为什么别人的想法总是很简单?自己好好多想想,还是得多做题,多读代码,多写多思考。注意笔记。

思考:我先是想到了结构体,但是忘记怎么写了。

while (~scanf("%d%d",&m,&n))什么用的?!=EOF

C

#include 
#include 
int main()
{
    int N;
    scanf("%d", &N);//输入数量 
    char maxname[11], minname[11], curname[11],//姓名,学号; 
        maxid[11], minid[11], curid[11];
    int maxgrade = -1, mingrade = 101, curgrade;//分数 
    for(int i = 0; i < N; i++)
    {
        scanf("%s %s %d", curname, curid, &curgrade);
        if(curgrade > maxgrade)
        {
            strcpy(maxname, curname);//复制 后给前 
            strcpy(maxid, curid);
            maxgrade = curgrade;
        }
        if(curgrade < mingrade)
        {
            strcpy(minname, curname);
            strcpy(minid, curid);
            mingrade = curgrade;
        }
    }
    printf("%s %s\n%s %s", maxname, maxid, minname, minid);
}

#include
#include
int main()
{
  int n=0;
  scanf("%d",&n);
  struct info{
    char name[15];
    char num[15];
    int grade;
  };
  struct info stu,max,min;
  scanf("%s %s %d",&stu.name,&stu.num,&stu.grade);
  max=min=stu;
  for(int i=1;imax.grade) max=stu; 
    if (stu.grade
using namespace std;
int main()
{
	int n, max = -1, min = 101, score;
	cin >> n;
	string maxname, minname, maxnum, minnum, name, num;
	for (int i = 0; i < n; i++) {
	cin >> name >> num >> score;
	if (max < score) {
	max = score;
	maxname = name;
	maxnum = num;
}
	if (min > score) {
	min = score;
	minname = name;
	minnum = num;
}
}
	cout << maxname << " " << maxnum << endl << minname << " " << minnum;

 

 

1086 就不告诉你

PAT乙级_第5张图片

 好吧,我是越写到后面就越觉得自己是个废物。不会的东西明明那么多,明明知道如何变强,却什么也不学,天天浪费时间。

明明是水题,却可能写也写不出来。

 https://blog.csdn.net/yky__xukai/article/details/79554963

stoi()把数字字符串转换成int输出stoi()会做范围检查,默认范围是在int的范围内的,如果超出范围的话则会runtime error!

将数值转化为字符串。返回对应的字符串。 to_string

 reverse(s.begin(), s.end()) c++ 字符串倒置函数

#include
using namespace std;
int main(){
    int A,B;
    scanf("%d%d",&A,&B);
    A*=B;                    // A=A*B 5*7=35=A
    for(B=0;A!=0;A/=10)      // 1. B=0+5 B=5 A/10=3 2.B=5*10+3=53
        B=B*10+A%10;
    printf("%d",B);
    return 0;
}

#include 
int main()
{
    int A, B, C;
    scanf("%d %d", &A, &B);
    C = A * B;
    while(!(C % 10))  // c%10==0 5*7=35  20
        C /= 10;      // 如果C=20 C/=10=2 下一步就是输出C=2 
    while(C)        //53
    {
        putchar('0' + C % 10);//输出单个  
        C /= 10;
    }
    return 0;
}





#include 
#include 
#include 
using namespace std;
int main() {
    int a, b;
    scanf("%d %d", &a, &b);
    string s = to_string(a * b);
    reverse(s.begin(), s.end());
    printf("%d", stoi(s));
    return 0;
}

 

 

1087 有多少不同的值 (20分)

 

PAT乙级_第6张图片

https://www.cnblogs.com/AKMer/p/9889811.html

明明是个水题,为什么看了答案,就能想明白,自己想的什么,却什么思路都没有。我是想到了FOR循环。

还是有一点吧,就是说 对语言的熟悉程序还是不够,其次没读懂题,看见题目的时候,就有点害怕。

C++的 STL学习的重要性 运用的重要性 算法思想 

#include
set
set头文件主要包括set和multiset两个容器。他们都是有序集合,不过set存的元素不可重复。
两者内部实现都是红黑树,在使用方法上差别不大,支持的函数基本相同。

#include 
int main()
{
	int c,m,m0=-1,count=0,n;
	scanf("%d",&m);
	for(n=1;n<=m;n++)
	{
		c=(n/2)+(n/3)+(n/5);
		if(c>m0)
		count++;
		m0=c;
	}
	printf("%d",count);
}



#include 
#include 
using namespace std;
int main() {
	int n;
	scanf("%d", &n);
	set s;//声明方式 
	for (int i = 1; i <= n; i++)
	s.insert(i / 2 + i / 3 + i / 5);//插入一个int类型的数据 
	printf("%d", s.size());//返回元素个数 
	return 0;
}

 

 

1091 N-自守数   还没写好 还没想过

PAT乙级_第7张图片

 

 

1008 数组元素循环右移问题 (20分)  没想明白

 

PAT乙级_第8张图片

 1111

11

1

 

#include 
int main()
{
    int N, M, numbers[100];
    scanf("%d %d", &N, &M);
    M %= N; /* M could be larger than N */
    /* Read */
    for(int i = 0; i < N; i++)
        scanf("%d", &numbers[i]);
    /* Print */
    for(int i = N - M; i < N; i++)      /* Print N - M to N - 1 */
        printf("%d ", numbers[i]);
    for(int i = 0; i < N - M - 1; i++)  /* Print 0 to N - M - 2 */
        printf("%d ", numbers[i]);
    printf("%d", numbers[N - M - 1]);   /* Print N - M - 1, no blankspace */

}



#include 
#include 
#include 
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector a(n);
for (int i = 0; i < n; i++)
cin >> a[i];
m %= n;
if (m != 0) {
reverse(begin(a), begin(a) + n);
reverse(begin(a), begin(a) + m);
reverse(begin(a) + m, begin(a) + n);
}
for (int i = 0; i < n - 1; i++)
cout << a[i] << " ";
cout << a[n - 1];
return 0;
}

 

 

 

 

 

1010 一元多项式求导 (25分) 

PAT乙级_第9张图片

 题目 居然有隐藏条件 不得不说 读题的时候 还是得仔细 

“输出导数多项式非零项的系数和指数”这个条件就是输出的时候只要某一项的指数为0,那么就不输出

这题的话 我想到了一点点,但是没有自己去写,然后看了别人的话,没发现隐藏条件的话,估计怎么写,也不会对。

PAT乙级_第10张图片

#include 
int main()
{
    int coef, index, count = 0;
    while(scanf("%d %d", &coef, &index) != EOF)
    {
        if(index) /* Constant terms result in zero */
        {
            if(count++) putchar(' ');
            printf("%d %d", coef * index, index - 1);
        }
    }
    /* Zero polynomial or constant */
    if(count == 0)
        puts("0 0");
}



#include
using namespace std;
int main()
{
	int coef;
	int expo;
	cin>>coef>>expo;
	if(expo==0)//如果指数为0,则求导后是0多项式
	{
		cout<<"0 0";
		return 0;
	} 
	else//注意第一次输出的格式 ! 
	cout<>coef>>expo)//输入直到文件末尾 
	if(expo!=0)//注意如果指数为0,不作输出! 
	cout<<' '<

 

 

1011 A+B 和 C (15分)

 

PAT乙级_第11张图片

我写程序的样子 像个智障 连基本的逻辑 都没有 问题 还很多 还找不出来 以前为什么会有喜欢编程的想法 

然后真正去操作的时候,越来越觉得或许自己不适合做程序员。

 

换行符的问题  for在里面与外面的问题  还有最后如何是控制 i  往简单想   大道至简  还有就是数据类型 %ld 

#include
int main()
{
	int T,i=0;
	long int A,B,C;
	scanf("%d",&T);
	while(scanf("%ld %ld %ld",&A,&B,&C)!=EOF)
	{
		i++;
		if(A+B>C)
		{

			printf("Case #%d: true\n",i);
		}
		else
			printf("Case #%d: false\n",i);
	}
}



#include 
using namespace std;
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
long long int a, b, c;
scanf("%lld%lld%lld", &a, &b, &c);
printf("Case #%d: %s\n", i + 1, a + b > c ? "true" : "false");
}
return 0;
}

 

 1012 数字分类 (20分)

PAT乙级_第12张图片

 

 

1016 部分A+B (15分)

 

PAT乙级_第13张图片

PAT乙级_第14张图片

有时候觉得有些编程题真傻逼,明明可以看出答案,却为什么还要我们写出来。

可基础决定高度。傻逼的往往是你自己,那个不求进取的自己。

这题我有大概的思路,不过还是错了。 

#include 
long Dpart(long A, int D_A)
{
    long P_A;
    for(P_A = 0; A; A /= 10)
        if(A % 10 == D_A)
            P_A = P_A * 10 + D_A;
    return P_A;
}
int main()
{
    long A, B;
    int D_A, D_B;
    scanf("%ld %d %ld %d", &A, &D_A, &B, &D_B);
    printf("%ld", Dpart(A, D_A) + Dpart(B, D_B));
    return 0;
}


#include 
int main()
{
	char a[12],b[12],da,db;
	while(~scanf("%s %c %s %c",a,&da,b,&db))
	{
		int acount=0,bcount=0;
		for(int i=0;a[i]!='\0';++i)
		{
			if(a[i]==da)
				++acount;
		}
		for(int i=0;b[i]!='\0';++i)
		{
			if(b[i]==db)
				++bcount;
		}
		int sa=0,sb=0;
		for(int i=0;i

 

1018 锤子剪刀布 (20分)

PAT乙级_第15张图片

 

水题,然后因为我在做康复训练,一直不在状态。。。所以就算我在状态,估计我也不会。有些东西还是得花时间。

 

#include 
char max(int B, int C, int J)
{
    if(B >= C && B >= J) return 'B';
    if(C >  B && C >= J) return 'C';
    /* J > B && J > C */ return 'J';
}
int main()
{
    int N;
    char a, b;
    int AwinB = 0, AwinC = 0, AwinJ = 0;
    int BwinB = 0, BwinC = 0, BwinJ = 0;
    scanf("%d", &N);
    for(int i = 0; i < N; i++)
    {
        scanf(" %c %c", &a, &b);  /* Notice the space before every %c */
        if(a == 'B' && b == 'C') AwinB++;
        if(a == 'C' && b == 'J') AwinC++;
        if(a == 'J' && b == 'B') AwinJ++;
        if(a == 'B' && b == 'J') BwinJ++;
        if(a == 'C' && b == 'B') BwinB++;
        if(a == 'J' && b == 'C') BwinC++;
    }
    int Awin = AwinB + AwinC + AwinJ;
    int Bwin = BwinB + BwinC + BwinJ;
    int Tie = N - Awin - Bwin;
    printf("%d %d %d\n", Awin, Tie, Bwin);
    printf("%d %d %d\n", Bwin, Tie, Awin);
    printf("%c %c", max(AwinB, AwinC, AwinJ), max(BwinB, BwinC, BwinJ));
    return 0;
}

 

 

你可能感兴趣的:(PAT)