乙级pta习题集(一)

乙级pta习题集(一)


1076 1070

1076 Wifi密码 (15 分)
下面是微博上流传的一张照片:“各位亲爱的同学们,鉴于大家有时需要使用 wifi,又怕耽误亲们的学习,现将 wifi 密码设置为下列数学题答案:A-1;B-2;C-3;D-4;请同学们自己作答,每两日一换。谢谢合作!!~”—— 老师们为了促进学生学习也是拼了…… 本题就要求你写程序把一系列题目的答案按照卷子上给出的对应关系翻译成 wifi 的密码。这里简单假设每道选择题都有 4 个选项,有且只有 1 个正确答案。
输入格式:
输入第一行给出一个正整数 N(≤ 100),随后 N 行,每行按照 编号-答案 的格式给出一道题的 4 个选项,T 表示正确选项,F 表示错误选项。选项间用空格分隔。

输出格式:
在一行中输出 wifi 密码。

输入样例:

8
A-T B-F C-F D-F
C-T B-F A-F D-F
A-F D-F C-F B-T
B-T A-F C-F D-F
B-F D-T A-F C-F
A-T C-F B-F D-F
D-T B-F C-F A-F
C-T A-F B-F D-F

输出样例:

13224143

#include<stdio.h>
int main(){
    int n;
    scanf("%d",&n);
    getchar();
    char a,b,c,d,a1,b1,c1,d1;
    for(int i=0;i<n;i++){
        scanf("%c-%c %c-%c %c-%c %c-%c",&a,&a1,&b,&b1,&c,&c1,&d,&d1);
        getchar();
        if(a1=='T') printf("%d",a-'A'+1);
        else if(b1=='T') printf("%d",b-'A'+1);
        else if(c1=='T') printf("%d",c-'A'+1);
        else if(d1=='T') printf("%d",d-'A'+1);
    }
    return 0;
}
//注意字母顺序会搞混 
//要用getchar处理换行符 
//2019/09/02 

1070 结绳 (25 分)
给定一段一段的绳子,你需要把它们串成一条绳。每次串连的时候,是把两段绳子对折,再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连。每次串连后,原来两段绳子的长度就会减半。

给定 N 段绳子的长度,你需要找出它们能串成的绳子的最大长度。

输入格式:
每个输入包含 1 个测试用例。每个测试用例第 1 行给出正整数 N (2≤N≤104);第 2 行给出 N 个正整数,即原始绳段的长度,数字间以空格分隔。所有整数都不超过104

输出格式:
在一行中输出能够串成的绳子的最大长度。结果向下取整,即取为不超过最大长度的最近整数。

输入样例:

8
10 15 12 3 4 13 1 15

输出样例:

14

#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cstdio>
using namespace std;
int main(){
    int n;
    scanf("%d",&n);
    int*a =(int*)malloc(n*sizeof(int));
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    sort(a,a+n);
    int i;
    for(i=1;i<n;i++){
        a[i]=(a[i-1]+a[i])/2;
    }
    printf("%d",a[n-1]);
    return 0;
}
//2019/09/02 

1048 1064

1048 数字加密 (20 分)
本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。

输入格式:
输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。

输出格式:
在一行中输出加密后的结果。

输入样例:

1234567 368782971

输出样例:

3695Q8118

#include<stdio.h>
int main(){
    int A[101],B[101],ans[101]={0};
    int count1=1,count2=1,count=1;
	char c;
    while((c=getchar())!=' '){  //错误 用c与" "比较  " "为字符串 
    	A[count1++]=c-'0';
	}
    while((c=getchar())!='\n'){//第二个为换行符 
    	B[count2++]=c-'0';
	}
	count2--;count1--;//使得两个索引指向最低位的数字 
    while(count2>0&&count1>0){//从两个数的后面开始往前处理  count用来分辨奇偶位 
        if(count%2==1){
            ans[count]=(A[count1]+B[count2])%13;
            count++;count1--;count2--;
        }
        else {
            ans[count]=(B[count2]-A[count1]);
            if(ans[count]<0) ans[count]+=10;
            count++;count2--;count1--;
        }
    }
    
    //A比B长或B比A长的情况 
    while(count2>=1) {//注意存数从1开始 
        ans[count]=B[count2];
        count++;count2--;
    }
    while(count1>=1){
    	if(count%2==1) {
    		ans[count]=A[count1];
    		count++;count1--;
		}
		else {
			ans[count]=-A[count1];//此处与上面相同   易错点为A中数字为0时不用加10 
            if(ans[count]<0) ans[count]+=10;
            count++;count2--;count1--;
		}
	}
    for(int i=count-1;i>=1;i--){//从count-1开始 
        switch(ans[i]){  //ans[i]而不是ans[count] 
            case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 0:
                printf("%d",ans[i]);break;//与上同理 
            case 10:printf("J");break;
            case 11:printf("Q");break;
            case 12:printf("K");break;
        }
    }
    return 0;
}

//2019.09.03 

1064 朋友数 (20 分)
如果两个整数各位数字的和是一样的,则被称为是“朋友数”,而那个公共的和就是它们的“朋友证号”。例如 123 和 51 就是朋友数,因为 1+2+3 = 5+1 = 6,而 6 就是它们的朋友证号。给定一些整数,要求你统计一下它们中有多少个不同的朋友证号。

输入格式:
输入第一行给出正整数 N。随后一行给出 N 个正整数,数字间以空格分隔。题目保证所有数字小于 10​4

输出格式:
首先第一行输出给定数字中不同的朋友证号的个数;随后一行按递增顺序输出这些朋友证号,数字间隔一个空格,且行末不得有多余空格。

输入样例:

8
123 899 51 998 27 33 36 12

输出样例:

4
3 6 9 26

#include<stdio.h>
int a[40]={0};
int main(){
    int n;
    int temp;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&temp);
        int ans=0;
        while(temp){
            ans+=temp%10;
            temp/=10;
        }
        a[ans]++;
    }
    int count=0;
    for(int i=0;i<40;i++){
        if(a[i]!=0) count++;
    }
    printf("%d\n",count);
    for(int i=0;i<40;i++){
        if(a[i]!=0){ printf("%d",i);
        count--;
        if(count!=0) printf(" ");} 
    }
    return 0;
}

//技巧 数小于10000 开一个40的数组
//2019.09.03 

1041 1043

1041 考试座位号 (15 分)
每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。

输入格式:
输入第一行给出一个正整数 N(≤1000),随后 N 行,每行给出一个考生的信息:准考证号 试机座位号 考试座位号。其中准考证号由 16 位数字组成,座位从 1 到 N 编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。

考生信息之后,给出一个正整数 M(≤N),随后一行中给出 M 个待查询的试机座位号码,以空格分隔。

输出格式:
对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用 1 个空格分隔。

输入样例:

4

3310120150912233 2 4
3310120150912119 4 1
3310120150912126 1 3
3310120150912002 3 2
2
3 4

输出样例:

3310120150912002 2
3310120150912119 1

#include<cstdio>
struct student{
    char num[17];//准考证16位 字符数组要多一位存放 
    int a;
    int b;
}students[1010];
int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		getchar();//吸收换行符 scanf用%s会自动添加\n 
		scanf("%s %d %d",students[i].num,&students[i].a,&students[i].b);
	} 
	int m,temp;
	scanf("%d",&m);
	for(int i=0;i<m;i++){
		scanf("%d",&temp);
		for(int j=0;j<n;j++){
			if(students[j].a==temp) printf("%s %d\n",students[j].num,students[j].b);//错误:两次使用变量i 
		}
	}
	return 0;
}

1043 输出PATest (20 分)
给定一个长度不超过 10​4的、仅由英文字母构成的字符串。请将字符重新调整顺序,按 PATestPATest… 这样的顺序输出,并忽略其它字符。当然,六种字符的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按 PATest 的顺序打印,直到所有字符都被输出。

输入格式:
输入在一行中给出一个长度不超过 104 的、仅由英文字母构成的非空字符串。

输出格式:
在一行中按题目要求输出排序后的字符串。题目保证输出非空。

输入样例:

redlesPayBestPATTopTeePHPereatitAPPT

输出样例:

PATestPATestPTetPTePePee

#include<stdio.h>
int main(){
    int a[6]={0};
    char c;
    while((c=getchar())!='\n'){//结尾换行符 
        if(c=='P') a[0]++;
        else if(c=='A') a[1]++;
        else if(c=='T') a[2]++;
        else if(c=='e') a[3]++;
        else if(c=='s') a[4]++; 
        else if(c=='t') a[5]++;
    }
    int count=0,num=0;
    for(int i=0;i<6;i++){
        num+=a[i];
    }
    while(1){
        switch(count%6){//注意为count%6而不是count 易错 
            case 0:if(a[count%6]>0) {printf("P");a[count%6]--;num--;}break; //break在括号外面 跳出循环 
            case 1:if(a[count%6]>0) {printf("A");a[count%6]--;num--;}break;
            case 2:if(a[count%6]>0) {printf("T");a[count%6]--;num--;}break;
            case 3:if(a[count%6]>0) {printf("e");a[count%6]--;num--;}break;
            case 4:if(a[count%6]>0) {printf("s");a[count%6]--;num--;}break;
            case 5:if(a[count%6]>0) {printf("t");a[count%6]--;num--;}break;
        }
        count++;
        if(!num) break;
    }
    return 0;
}
//初始化整数数组用来存储 需要的字符出现的个数 其余字符不要
// 循环检索并输出数组里的字符,同时减少num 直到num为0

1037 1077

1037 在霍格沃茨找零钱 (20 分)
如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易。”现在,给定哈利应付的价钱 P 和他实付的钱 A,你的任务是写一个程序来计算他应该被找的零钱。

输入格式:
输入在 1 行中分别给出 P 和 A,格式为 Galleon.Sickle.Knut,其间用 1 个空格分隔。这里 Galleon 是 [0, 107] 区间内的整数,Sickle 是 [0, 17) 区间内的整数,Knut 是 [0, 29) 区间内的整数。

输出格式:
在一行中用与输入同样的格式输出哈利应该被找的零钱。如果他没带够钱,那么输出的应该是负数。

输入样例 1:

10.16.27 14.1.28

输出样例 1:

3.2.1

输入样例 2:

14.1.28 10.16.27

输出样例 2:

-3.2.1

#include<stdio.h>
int main(){
    int a,b,c;
    int a1,b1,c1;
    int a2,b2,c2;
    int ans1,ans2;
    scanf("%d.%d.%d ",&a,&b,&c);
    scanf("%d.%d.%d",&a1,&b1,&c1);//这里不用空格 为换行符 
    ans1=c+29*b+17*29*a;
    ans2=c1+29*b1+17*29*a1;
    ans2-=ans1;
    a2=ans2/493;b2=ans2%493/29;c2=ans2%29;
    if(ans2>=0) printf("%d.%d.%d",a2,b2,c2);//注意等于0的情况 
    else printf("-%d.%d.%d",-a2,-b2,-c2);
    return 0;
}
//简单题 换零钱 
//2019.09.06 

1077 互评成绩计算 (20 分)
在浙大的计算机专业课中,经常有互评分组报告这个环节。一个组上台介绍自己的工作,其他组在台下为其表现评分。最后这个组的互评成绩是这样计算的:所有其他组的评分中,去掉一个最高分和一个最低分,剩下的分数取平均分记为 G1;老师给这个组的评分记为 G2。该组得分为 (G1+G2)/2,最后结果四舍五入后保留整数分。本题就要求你写个程序帮助老师计算每个组的互评成绩。

输入格式:
输入第一行给出两个正整数 N(> 3)和 M,分别是分组数和满分,均不超过 100。随后 N 行,每行给出该组得到的 N 个分数(均保证为整型范围内的整数),其中第 1 个是老师给出的评分,后面 N−1 个是其他组给的评分。合法的输入应该是 [0,M] 区间内的整数,若不在合法区间内,则该分数须被忽略。题目保证老师的评分都是合法的,并且每个组至少会有 3 个来自同学的合法评分。

输出格式:
为每个组输出其最终得分。每个得分占一行。

输入样例:

6 50
42 49 49 35 38 41
36 51 50 28 -1 30
40 36 41 33 47 49
30 250 -25 27 45 31
48 0 0 50 50 1234
43 41 36 29 42 29

输出样例:

42
33
41
31
37
39

#include<stdio.h>
int main(){
    int n,m;
    double g1,g2;
	int count,temp; 
    scanf("%d %d",&n,&m);
    for(int i=0;i<n;i++){
        g2=0,count=0;
        scanf("%lf",&g1);
		int max=-99999,min=999999;
        for(int j=0;j<n-1;j++){
            scanf("%d",&temp);
            if(temp>=0&&temp<=m) {
                g2+=temp;
				count++;
				if(temp>max) max=temp;
				if(temp<min) min=temp;
			}
        }
        g2=(g2-max-min)/(count-2);//最后处于真实人数count 
        printf("%d\n",(int)((g1+g2)/2+0.5));// printf("%.0f,会出错 
    }
    return 0;
}
//2019.09.06

1039 1087

1039 到底买不买 (20 分)
小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。

为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如在图1中,第3串是小红想做的珠串;那么第1串可以买,因为包含了全部她想要的珠子,还多了8颗不需要的珠子;第2串不能买,因为没有黑色珠子,并且少了一颗红色的珠子。

输入格式:
每个输入包含 1 个测试用例。每个测试用例分别在 2 行中先后给出摊主的珠串和小红想做的珠串,两串都不超过 1000 个珠子。

输出格式:
如果可以买,则在一行中输出 Yes 以及有多少多余的珠子;如果不可以买,则在一行中输出 No 以及缺了多少珠子。其间以 1 个空格分隔。

输入样例 1:

ppRYYGrrYBR2258
YrR8RrY

输出样例 1:

Yes 8

输入样例 2:

ppRYYGrrYB225
YrR8RrY

输出样例 2:

No 2

#include<stdio.h>
int main(){
    int a[62]={0};
    char c;
    int count=0;//count为老板的珠子数量 
    while((c=getchar())!='\n'){//字符转换为整数存储 
        count++;
        if(c>='0'&&c<='9') a[c-'0']++;
        else if(c>='a'&&c<='z') a[c-'a'+10]++;
        else if(c>='A'&&c<='Z') a[c-'A'+36]++;
    }
    int count1=count,count2=0;//count1为剩下的珠子数量 count2为想要的珠子数量 
   // for(int i=0;i<62;i++) printf("%d",a[i]);
    while((c=getchar())!='\n'){
        count2++;
            if(c>='0'&&c<='9') {
                for(int i=0;i<10;i++){
                    if(c-'0'==i&&a[i]>0){
                        count1--;
                        a[i]--;
                    }
                }
            }
            else if(c>='a'&&c<='z') {
                for(int i=10;i<36;i++){
                    if(c-'a'+10==i&&a[i]>0){//应该与i比较 
                        count1--;a[i]--;
                    }
                }
            }
            else if(c>='A'&&c<='Z') {
                for(int i=36;i<62;i++){
                    if(c-'A'+36==i&&a[i]>0){//忘记a[i]-- 
                        count1--;a[i]--;
                    }
                }
            }
        }
   // printf("count=%d count1=%d count2=%d\n",count,count1,count2);
    if(count2==count-count1) printf("Yes %d",count1);
    else printf("No %d",count2-(count-count1));
    return 0;
}
//2019.09.07
//要用三个count区分 第一个算总数 第二个算被扣除的数 第三个算第二串珠子
//用整数数组 62个空间来存储每个珠子的数量情况 下标紧密排放珠子 对比时用c-'0'与下标对比 对比时有三个分支 每个分支里对不同的范围检索第一个数组进行查找 
//根据比较以及是否有剩余珠子判断 

1087 有多少不同的值 (20 分)
当自然数 n 依次取 1、2、3、……、N 时,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注:⌊x⌋ 为取整函数,表示不超过 x 的最大自然数,即 x 的整数部分。)

输入格式:
输入给出一个正整数 N(2≤N≤104)。
输出格式:
在一行中输出题面中算式取到的不同值的个数。

输入样例:

2017

输出样例:

1480

#include<stdio.h>
int num[21000]={0};
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){//自然数从1至n 
        int temp=i/2+i/3+i/5;//理论上 加起来的值可能为31/30 数组开大一点 
        num[temp]++;
    }
    int ans=0;
    for(int i=0;i<21000;i++){//值可能从0到小于数组最大范围的数 
        if(num[i]>0) ans++;//有重叠的值也只计数一次 
    }
    printf("%d",ans);
    return 0;
}
//2019.09.07
//简单题 空间换时间 
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值