题目名称是超链接
我会一直进阶到我自学不懂做不出来题为止【抱拳】
阶段一(简单,主要包括输入输出,顺序结构,分支结构,循环结构)
前置知识:知识
T1【PTA】
分数 5
作者 陈越
单位 浙江大学
这道超级简单的题目没有任何输入。
你只需要在一行中输出著名短句“Hello World!”就可以了。
输入样例:
无
输出样例:
Hello World!
代码实现:
#include<stdio.h>//c头文件
int main()
{
printf("Hello World!");//输出
return 0;
}
c++
#include<bits/stdc++.h>//c++万能头文件
using namespace std;//声明命名空间
int main()
{
printf("Hello World!");
return 0;
}
T2【PTA】
L1-023 输出GPLT
作者 陈越
单位 浙江大学
给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT....
这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT
的顺序打印,直到所有字符都被输出。
输入格式:
输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。
输出格式:
在一行中按题目要求输出排序后的字符串。题目保证输出非空。
输入样例:
pcTclnGloRgLrtLhgljkLhGFauPewSKgt
输出样例:
GPLTGPLTGLTGLGLL
代码实现:(方法比较笨)
#include <stdio.h>
#include <string.h>
int main() {
char s[10001];
int a[5];
scanf("%s",s);
memset(a, 0, sizeof(a));
for (register int i = 0; i < strlen(s); i++) {
//这里其实可以考虑使用tolower,toupper,strupr等函数
if (s[i] == 'G'||s[i]=='g') {
a[0]++;//记录数目
}
if (s[i] == 'P'||s[i]=='p') {
a[1]++;
}
if (s[i] == 'L'||s[i]=='l') {
a[2]++;
}
if (s[i] == 'T'||s[i]=='t') {
a[3]++;
}
}
while (a[0] != 0 || a[1] != 0 || a[2] != 0 || a[3] != 0) {
if (a[0] != 0) {
printf("G");
a[0]--;//还未输出结束
}
if (a[1] != 0) {
printf("P");
a[1]--;
}
if (a[2] != 0) {
printf("L");
a[2]--;
}
if (a[3] != 0) {
printf("T");
a[3]--;
}
}
return 0;
}
T3【PTA】
L1-002 打印沙漏
代码及详解
代码实现: (略微麻烦)
#include<stdio.h>
int main()
{
int n,pos=1,num=1,last;//last是剩余符号数,num是判断一个完整的三角可以有几行
char c;
scanf("%d %c",&n,&c);
while(pos<=n)//判断最多可以使用多少符号
{
pos+=(2*num+1)*2;
num++;
}
num=num-1;//最后多了一次循环
last=n-pos+(2*num+1)*2;//计算剩余符号数
//printf("%d\n",num);
for(register int i=num;i>=1;i--)//先输出倒三角
{
for(register int j=1;j<=(num-i);j++)//左半空格的输出
{
printf(" ");
}
for(register int j=i*2-1;j>=1;j--)//输出符号
{
printf("%c",c);
}
printf("\n");//别忘换行
}
for(register int i=2;i<=num;i++)//输出下半三角,没有三角尖其余和上方代码相反
{
for(register int j=1;j<=num-i;j++)
{
printf(" ");
}
for(register int j=i*2-1;j>=1;j--)
{
printf("%c",c);
}
printf("\n");
}
printf("%d",last);
return 0;
}
T4【PTA】
L1-054 福到了
作者 陈越
单位 浙江大学
“福”字倒着贴,寓意“福到”。不论到底算不算民俗,本题且请你编写程序,把各种汉字倒过来输出。这里要处理的每个汉字是由一个 N × N 的网格组成的,网格中的元素或者为字符 @
或者为空格。而倒过来的汉字所用的字符由裁判指定。
输入格式:
输入在第一行中给出倒过来的汉字所用的字符、以及网格的规模 N (不超过100的正整数),其间以 1 个空格分隔;随后 N 行,每行给出 N 个字符,或者为 @
或者为空格。
输出格式:
输出倒置的网格,如样例所示。但是,如果这个字正过来倒过去是一样的,就先输出bu yong dao le
,然后再用输入指定的字符将其输出。
输入样例 1:
$ 9
@ @@@@@
@@@ @@@
@ @ @
@@@ @@@
@@@ @@@@@
@@@ @ @ @
@@@ @@@@@
@ @ @ @
@ @@@@@
输出样例 1:
$$$$$ $
$ $ $ $
$$$$$ $$$
$ $ $ $$$
$$$$$ $$$
$$$ $$$
$ $ $
$$$ $$$
$$$$$ $
输入样例 2:
& 3
@@@
@
@@@
输出样例 2:
bu yong dao le
&&&
&
&&&
代码实现: 代码及详解
(当时为练习二维字符数组使用的方法比较麻烦)
#include<stdio.h>
int main()
{
char s,a[1001][1001],b[1001][1001];
int n;
scanf("%c %d",&s,&n);
getchar();
for(register int i=1;i<=(n+1);i++)
{
for(register int j=1;j<=(n+1);j++)
{
scanf("%c",&a[i][j]);//多的一行一列用来存储回车
}
}
for(register int i=1;i<=n;i++)
{
for(register int j=1;j<=n;j++)
{
b[n-i+1][n-j+1]=a[i][j];//颠倒
}
}
int flag=1;//判断是否相同
for(register int i=1;i<=n;i++)
{
for(register int j=1;j<=n;j++)
{
if(a[i][j]!=b[i][j])
{
flag=0;
break;
}
}
}
if(flag==1)
{
printf("bu yong dao le\n");
}
for(register int i=1;i<=n;i++)
{
for(register int j=1;j<=n;j++)
{
if(b[i][j]=='@')
{
printf("%c",s);//交换字符
continue;
}
printf(" ");
}
printf("\n");
}
return 0;
}
其他方法:gets输入首尾比较逆向输出,未调试完成
T5【PTA】
L1-003 个位数统计
分数 15
单位 浙江大学
给定一个 k 位整数 N=dk−110k−1+⋯+d1101+d0 (0≤di≤9, i=0,⋯,k−1, dk−1>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。
输入格式:
每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。
输出格式:
对 N 中每一种不同的个位数字,以 D:M
的格式在一行中输出该位数字 D
及其在 N 中出现的次数 M
。要求按 D
的升序输出。
输入样例:
100311
输出样例:
0:2
1:3
3:1
代码实现:
#include<stdio.h>
#include<string.h>
int main()
{
char s[10001];
int a[10001];
memset(a,0,sizeof(a));//初始化
gets(s);
for(register int i=0;i<strlen(s);i++)
{
a[s[i]-'0']++;//计数
}
for(register int i=0;i<=9;i++)
{
if(a[i]!=0)
{
printf("%d:%d\n",i,a[i]);//输出个数
}
}
return 0;
}
未完待续
阶段二(超基础算法以及模板)
前置知识:基本排序算法(个人习惯常用冒泡排序,桶排序,c++堆排序)
欧几里得算法等
T1【PTA】
L1-010 比较大小
分数 10
作者 杨起帆
单位 浙大城市学院
本题要求将输入的任意3个整数从小到大输出。
输入格式:
输入在一行中给出3个整数,其间以空格分隔。
输出格式:
在一行中将3个整数从小到大输出,其间以“->”相连。
输入样例:
4 2 8
输出样例:
2->4->8
使用冒泡排序解决(此题没有必要,不过可以修改为通解):
#include<stdio.h>
int main()
{
int a[11];
for(register int i=1;i<=3;i++)
{
scanf("%d",&a[i]);
}
for(register int i=1;i<=3;i++)//冒泡排序模板
{
for(register int j=1;j<=(3-i);j++)
{
if(a[j]>a[j+1])
{
int t;
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(register int i=1;i<=3;i++)
{
printf("%d",a[i]);
if(i!=3)
{
printf("->");//符合格式
}
}
return 0;
}
T2【PTA】
L1-088 静静的推荐
详细解释
分数 20
作者 陈越
单位 浙江大学
天梯赛结束后,某企业的人力资源部希望组委会能推荐一批优秀的学生,这个整理推荐名单的任务就由静静姐负责。企业接受推荐的流程是这样的:
- 只考虑得分不低于 175 分的学生;
- 一共接受 K 批次的推荐名单;
- 同一批推荐名单上的学生的成绩原则上应严格递增;
- 如果有的学生天梯赛成绩虽然与前一个人相同,但其参加过 PAT 考试,且成绩达到了该企业的面试分数线,则也可以接受。
给定全体参赛学生的成绩和他们的 PAT 考试成绩,请你帮静静姐算一算,她最多能向企业推荐多少学生?
输入格式:
输入第一行给出 3 个正整数:N(≤105)为参赛学生人数,K(≤5×103)为企业接受的推荐批次,S(≤100)为该企业的 PAT 面试分数线。
随后 N 行,每行给出两个分数,依次为一位学生的天梯赛分数(最高分 290)和 PAT 分数(最高分 100)。
输出格式:
在一行中输出静静姐最多能向企业推荐的学生人数。
输入样例:
10 2 90
203 0
169 91
175 88
175 0
175 90
189 0
189 0
189 95
189 89
256 100
输出样例:
8
样例解释:
第一批可以选择 175、189、203、256 这四个分数的学生各一名,此外 175 分 PAT 分数达到 90 分的学生和 189 分 PAT 分数达到 95 分的学生可以额外进入名单。第二批就只剩下 175、189 两个分数的学生各一名可以进入名单了。最终一共 8 人进入推荐名单。
代码实现:
#include<stdio.h>
#include<string.h>
struct ss
{
int sto,num,pos;
}a[10001],t;
int main()
{
int n,k,s,ans=0;
scanf("%d %d %d",&n,&k,&s);
for(register int i=1;i<=n;i++)
{
scanf("%d %d",&a[i].sto,&a[i].num);
a[i].pos=0;//初始化
if(a[i].num>=s&&a[i].sto>=175)//直接取出达到面试成绩的人进行录取
{
//printf("%d %d\n",a[i].sto,a[i].num);
ans++;
a[i].pos=1;//已录取
}
}
for(register int i=1;i<=n;i++)//考试成绩从大到小排序
{
for(register int j=1;j<=(n-i);j++)
{
if(a[j].sto<a[j+1].sto)
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
int b[10001];
memset(b,0,sizeof(b));
for(register int i=1;i<=n;i++)
{
if(a[i].sto>=175&&b[a[i].sto]<k&&a[i].pos==0)//逐个对应成绩达标,符合录取批次,尚未录取
{
//printf("%d %d %d\n",i,b[a[i].sto],a[i].sto);
ans++;
b[a[i].sto]++;//计数
}
}
printf("%d",ans);
return 0;
}