C语言进阶之路+期末复习【超详细】【持续更新】——MZH

题目名称是超链接

我会一直进阶到我自学不懂做不出来题为止【抱拳】

阶段一(简单,主要包括输入输出,顺序结构,分支结构,循环结构)

前置知识:知识

T1【PTA】

L1-001 Hello World

分数 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−1​10k−1+⋯+d1​101+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;
}

  • 17
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值