乙级pta练习集(二)

乙级pta练习集(二)


1042 1067 1091 1029 1078 1086 1081 1071 1066 1031 1072 1038

1042 字符统计 (20 分)
请编写程序,找出一段给定文字中出现最频繁的那个英文字母。

输入格式:
输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母,以回车结束(回车不算在内)。

输出格式:
在一行中输出出现频率最高的那个英文字母及其出现次数,其间以空格分隔。如果有并列,则输出按字母序最小的那个字母。统计时不区分大小写,输出小写字母。

输入样例:

This is a simple TEST. There ARE numbers and other symbols 1&2&3…

输出样例:

e 7

#include<stdio.h>
int main(){
    int a[26]={0};
    char temp;
    while((temp=getchar())!='\n'){
    	if(temp>='A'&&temp<='Z')   a[temp-'A']++;//大写换小写 
        else if(temp>='a'&&temp<='z') a[temp-'a']++;
    }
    int max=0;
    for(int i=0;i<26;i++){
        if(a[i]>a[max]) max=i;//有并列的就按字母序小的 不改变max下标 
    }
    printf("%c %d",max+'a',a[max]);
    return 0;
}
//2019.09.09 

1067 试密码 (20 分)
当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死。本题就请你实现这个小功能。

输入格式:
输入在第一行给出一个密码(长度不超过 20 的、不包含空格、Tab、回车的非空字符串)和一个正整数 N(≤ 10),分别是正确的密码和系统允许尝试的次数。随后每行给出一个以回车结束的非空字符串,是用户尝试输入的密码。输入保证至少有一次尝试。当读到一行只有单个 # 字符时,输入结束,并且这一行不是用户的输入。

输出格式:
对用户的每个输入,如果是正确的密码且尝试次数不超过 N,则在一行中输出 Welcome in,并结束程序;如果是错误的,则在一行中按格式输出 Wrong password: 用户输入的错误密码;当错误尝试达到 N 次时,再输出一行 Account locked,并结束程序。

输入样例 1:

Correct%pw 3
correct%pw
Correct@PW
whatisthepassword!
Correct%pw

输出样例 1:

Wrong password: correct%pw
Wrong password: Correct@PW
Wrong password: whatisthepassword!
Account locked

输入样例 2:

cool@gplt 3
coolman@gplt
coollady@gplt
cool@gplt
try again

输出样例 2:

Wrong password: coolman@gplt
Wrong password: coollady@gplt
Welcome in

#include<iostream>
#include<cstring>
using namespace std;
int main(){
	char words[21];int n,i=0;char ans[2100]={'\0'};
    scanf("%s%d",words,&n);
    getchar();//吸收换行符 
    while(true){
        cin.getline(ans,2100);//ans数组要开大点 同时有空格 
    	if(i==n){printf("Account locked\n");return 0;}  //这两行倒转会错一个点 
        if (strcmp(ans, "#") == 0) return 0;//"#"为字符串 
    	if(strcmp(ans,words)!=0) printf("Wrong password: %s\n",ans);
    	else {printf("Welcome in\n");return 0;}
    	i++;
	}
    return 0;
}
//2019.09.09
//这题很奇怪...一直卡两个点 

1091 N-自守数 (15 分)
如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为“N-自守数”。例如 3×922=25392,而 25392 的末尾两位正好是 92,所以 92 是一个 3-自守数。

本题就请你编写程序判断一个给定的数字是否关于某个 N 是 N-自守数。

输入格式:
输入在第一行中给出正整数 M(≤20),随后一行给出 M 个待检测的、不超过 1000 的正整数。

输出格式:
对每个需要检测的数字,如果它是 N-自守数就在一行中输出最小的 N 和 NK2的值,以一个空格隔开;否则输出 No。注意题目保证 N<10。

输入样例:

3
92 5 233

输出样例:

3 25392
1 25
No

#include<iostream>
using namespace std;
int main(){
	int m,k;
	scanf("%d",&m);
	for(int i=0;i<m;i++){
		scanf("%d",&k);
		int flag=0,temp=1;
		while (k/temp)temp*=10;
		for(int n=1;n<10;n++){
			if(k*k*n%temp==k){
				flag=1;printf("%d %d\n",n,k*k*n);break;
			}
		}
		if(flag) flag=0;
		else printf("No\n");
	}
	return 0;
} 

//简单题 找比k多一位的10的次方数  用于求余 
//2019.09.10 

1029 旧键盘 (20 分)
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。

输入格式:
输入在 2 行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过 80 个字符的串,由字母 A-Z(包括大、小写)、数字 0-9、以及下划线 _(代表空格)组成。题目保证 2 个字符串均非空。

输出格式:
按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有 1 个坏键。

输入样例:

7_This_is_a_test
_hs_s_a_es

输出样例:

7TI

#include<iostream>
#include<cstring>
using namespace std;
int main(){
    char a[81],b[81],c[81];
    char temp;
       int i=0,j=0,t=0,flag=0;
    while((temp=getchar())!='\n'){
        if(temp>='a'&&temp<='z') a[i++]=temp-32;
        else a[i++]=temp;
    }
     while((temp=getchar())!='\n'){
        if(temp>='a'&&temp<='z')b[j++]=temp-32;
        else b[j++]=temp;
    }
    a[i]='\0',b[j]='\0';

    int len1=strlen(a),len2=strlen(b);
    //printf("len1=%d len2=%d\n",len1,len2);
    i=0;j=0;
    while(i<len1&&j<len2){
        if(a[i]!=b[j]){
            for (int k=0;k<t;k++){
                if(a[i]==c[k]) {
                    i++;flag=1;break;
                }
            }
            if(flag){
                flag=0;continue;
            }
            printf("%c",a[i]);
            c[t++]=a[i];
            i++;
           // printf("1\n");
        }
        else {
            i++;j++;//printf("2\n");
        }
    }
   // c[t]='\0';
    while(i<len1){
    	for (int k=0;k<t;k++){
                if(a[i]==c[k]) {
                    i++;flag=1;break;
                }
            }
        if(flag) {
        	flag=0;continue;
		}
		printf("%c",a[i]);i++;
	}
   // printf("%s\n%s\n%s",a,b,c);
    return 0;
}
//2019/09/10
//两个字符串输入 输入时字母全换大写
//逐个匹配 不一样的一定是A多了 A字符串往下跳 同时计入C里
//有可能A比B长 此时 再不断比对 

1078 字符串压缩与解压 (20 分)
文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。例如 ccccc 就用 5c 来表示。如果字符没有重复,就原样输出。例如 aba 压缩后仍然是 aba。

解压方法就是反过来,把形如 5c 这样的表示恢复为 ccccc。

本题需要你根据压缩或解压的要求,对给定字符串进行处理。这里我们简单地假设原始字符串是完全由英文字母和空格组成的非空字符串。

输入格式:
输入第一行给出一个字符,如果是 C 就表示下面的字符串需要被压缩;如果是 D 就表示下面的字符串需要被解压。第二行给出需要被压缩或解压的不超过 1000 个字符的字符串,以回车结尾。题目保证字符重复个数在整型范围内,且输出文件不超过 1MB。

输出格式:
根据要求压缩或解压字符串,并在一行中输出结果。

输入样例 1:

C
TTTTThhiiiis isssss a tesssst CAaaa as

输出样例 1:

5T2h4is i5s a3 te4st CA3a as

输入样例 2:

D
5T2h4is i5s a3 te4st CA3a as10Z

输出样例 2

TTTTThhiiiis isssss a tesssst CAaaa asZZZZZZZZZZ

#include<iostream>
#include<cstring>
using namespace std;
int main(){
    char c,a[1001];
    c=getchar();  //错误 getchar(c)
    getchar();
    if(c=='C'){
		cin.getline(a,1001);
		int len=strlen(a),count=1;
		for(int i=0;i<len;i++){
			if(a[i]==a[i+1]) count++;
			else {
				if(count>1) {
				printf("%d%c",count,a[i]);
				count=1;}
				else printf("%c",a[i]);//i-1与i比较会有一个错误点 且最后的输出难以确定 i与i+1比较 最后碰到与空字符比较 可以保证输出 
			}
		}
    }
    else {
        cin.getline(a,1001);
        int len=strlen(a),flag=0,count=1;
        for(int i=0;i<len;i++){
        	if(a[i]>='0'&&a[i]<='9'){
        		if(flag){
        			count=count*10+a[i]-'0';
				}
				else{
					count*=a[i]-'0';
				}
				flag=1;
			}
			else{
				if(flag) {
					for(int j=0;j<count;j++) printf("%c",a[i]);
					count=1;
				}
				else 	printf("%c",a[i]);
				flag=0;
			}
		}
    }
    return 0;
}    
//2019.09.11 

1086 就不告诉你 (15 分)
做作业的时候,邻座的小盆友问你:“五乘以七等于多少?”你应该不失礼貌地围笑着告诉他:“五十三。”本题就要求你,对任何一对给定的正整数,倒着输出它们的乘积。

输入格式:
输入在第一行给出两个不超过 1000 的正整数 A 和 B,其间以空格分隔。

输出格式:
在一行中倒着输出 A 和 B 的乘积。

输入样例:

5 7

输出样例:

53

#include<iostream>
#include<cstring>
using namespace std;
int main(){
	int a,b;
	cin>>a>>b;
	int c=a*b;
	int flag=0;
	while(c){
		if(c%10||flag) {  cout<<c%10;flag=1;}
		c/=10;
	}
	return 0;
} 

//2019/09/11 
//可能会出现 100 1010 101 的情况 三种的结果分别为 1 101 101 

1081 检查密码 (15 分)
本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能。该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母、数字和小数点 .,还必须既有字母也有数字。

输入格式:
输入第一行给出一个正整数 N(≤ 100),随后 N 行,每行给出一个用户设置的密码,为不超过 80 个字符的非空字符串,以回车结束。

输出格式:
对每个用户的密码,在一行中输出系统反馈信息,分以下5种:

如果密码合法,输出Your password is wan mei.;
如果密码太短,不论合法与否,都输出Your password is tai duan le.;
如果密码长度合法,但存在不合法字符,则输出Your password is tai luan le.;
如果密码长度合法,但只有字母没有数字,则输出Your password needs shu zi.;
如果密码长度合法,但只有数字没有字母,则输出Your password needs zi mu.。
输入样例:

5
123s
zheshi.wodepw
1234.5678
WanMei23333
pass*word.6

输出样例:

Your password is tai duan le.
Your password needs shu zi.
Your password needs zi mu.
Your password is wan mei.
Your password is tai luan le.

#include<iostream>
#include<cstring>
using namespace std;
int main(){
	int n;
	char a[81];
	scanf("%d",&n);getchar();
	for(int i=0;i<n;i++){
		cin.getline(a,81);
		int len=strlen(a),flag1=0,flag2=0,temp=0;
		if(len<6) {printf("Your password is tai duan le.\n");continue;}
		for(int j=0;j<len;j++){
			if(!((a[j]>='a'&&a[j]<='z')||(a[j]>='A'&&a[j]<='Z')||(a[j]>='0'&&a[j]<='9')||a[j]=='.')) {
				temp=1;
			}
			else if((a[j]>='a'&&a[j]<='z')||(a[j]>='A'&&a[j]<='Z')) flag1=1;
			else if((a[j]>='0'&&a[j]<='9')) flag2=1;
		}
		if(temp) {printf("Your password is tai luan le.\n");continue;}
		if(flag1&&flag2)
		printf("Your password is wan mei.\n");
		else if(!flag1&&flag2) printf("Your password needs zi mu.\n");
		else if(flag1&&!flag2) printf("Your password needs shu zi.\n");
	}
	return 0;
} 
//2019.09.11 
//神坑题 输入有空格
//用cin.getline()时要用getchar吸收换行符  scanf就不用吸收换行符 

1071 小赌怡情 (15 分)
常言道“小赌怡情”。这是一个很简单的小游戏:首先由计算机给出第一个整数;然后玩家下注赌第二个整数将会比第一个数大还是小;玩家下注 t 个筹码后,计算机给出第二个数。若玩家猜对了,则系统奖励玩家 t 个筹码;否则扣除玩家 t 个筹码。

注意:玩家下注的筹码数不能超过自己帐户上拥有的筹码数。当玩家输光了全部筹码后,游戏就结束。

输入格式:
输入在第一行给出 2 个正整数 T 和 K(≤ 100),分别是系统在初始状态下赠送给玩家的筹码数、以及需要处理的游戏次数。随后 K 行,每行对应一次游戏,顺序给出 4 个数字:

n1 b t n2
其中 n1 和 n2 是计算机先后给出的两个[0, 9]内的整数,保证两个数字不相等。b 为 0 表示玩家赌小,为 1 表示玩家赌大。t 表示玩家下注的筹码数,保证在整型范围内。

输出格式:
对每一次游戏,根据下列情况对应输出(其中 t 是玩家下注量,x 是玩家当前持有的筹码量):

玩家赢,输出 Win t! Total = x.;
玩家输,输出 Lose t. Total = x.;
玩家下注超过持有的筹码量,输出 Not enough tokens. Total = x.;
玩家输光后,输出 Game Over. 并结束程序。
输入样例 1:

100 4
8 0 100 2
3 1 50 1
5 1 200 6
7 0 200 8

输出样例 1:

Win 100! Total = 200.
Lose 50. Total = 150.
Not enough tokens. Total = 150.
Not enough tokens. Total = 150.

输入样例 2:

100 4
8 0 100 2
3 1 200 1
5 1 200 6
7 0 200 8

输出样例 2:

Win 100! Total = 200.
Lose 200. Total = 0.
Game Over.

#include<iostream>
using namespace std;
int main(){
	int T,K;
	scanf("%d %d",&T,&K);
	for(int i=0;i<K;i++){
		int n1,b,t,n2;
		scanf("%d %d %d %d",&n1,&b,&t,&n2);
		if(t>T) printf("Not enough tokens.  Total = %d.\n",T);
		else if(n1>n2&&b==0||b==1&&n1<n2) printf("Win %d!  Total = %d.\n",t,T=T+t);
		else printf("Lose %d.  Total = %d.\n",t,T=T-t);
		if(T==0) {printf("Game Over.\n");break;}
	}
	return 0;
} 
//简单题
//2019.09.11 

1066 图像过滤 (15 分)
图像过滤是把图像中不重要的像素都染成背景色,使得重要部分被凸显出来。现给定一幅黑白图像,要求你将灰度值位于某指定区间内的所有像素颜色都用一种指定的颜色替换。

输入格式:
输入在第一行给出一幅图像的分辨率,即两个正整数 M 和 N(0<M,N≤500),另外是待过滤的灰度值区间端点 A 和 B(0≤A<B≤255)、以及指定的替换灰度值。随后 M 行,每行给出 N 个像素点的灰度值,其间以空格分隔。所有灰度值都在 [0, 255] 区间内。

输出格式:
输出按要求过滤后的图像。即输出 M 行,每行 N 个像素灰度值,每个灰度值占 3 位(例如黑色要显示为 000),其间以一个空格分隔。行首尾不得有多余空格。

输入样例:

3 5 100 150 0
3 189 254 101 119
150 233 151 99 100
88 123 149 0 255

输出样例:

003 189 254 000 000
000 233 151 099 000
088 000 000 000 255

#include<iostream>
using namespace std;
int main(){
	int m,n,a,b,t,temp;
	int num[500][500];
	scanf("%d %d %d %d %d",&m,&n,&a,&b,&t);
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			scanf("%d",&temp);
			if(temp>=a&&temp<=b) temp=t;
			num[i][j]=temp;
		}
	}
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			printf("%03d",num[i][j]);
			if(j!=n-1) printf(" ");
		}
		printf("\n");
	}
} 
//2019.09.11

1031 查验身份证 (15 分)
一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:

首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:

Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2

现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。

输入格式:
输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。

输出格式:
按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed。

输入样例1:

4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X

输出样例1:

12010X198901011234
110108196711301866
37070419881216001X

输入样例2:

2
320124198808240056
110108196711301862

输出样例2:

All passed

#include<iostream>
using namespace std;
int main(){
	int n;
	int num[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
	char z[11]={'1','0','X','9','8','7','6','5','4','3','2'}; 	
	int sum,count=0,flag=0;
	char id[100];
	scanf("%d",&n);
		getchar();
	for(int i=0;i<n;i++){
		cin.getline(id,20);
		sum=0;flag=0;
		for(int j=0;j<17;j++){
			if(id[j]>='0'&&id[j]<='9')
				sum+=num[j]*(id[j]-'0');
			else {
				printf("%s\n",id);flag=1;count=1;//出错 忘记修改count 若全是中途有非数字的 最后会输出all passed 
				break;
			}
		}
		if(flag){
			flag=0;continue;
		}
		else {
			sum%=11; 
			if(z[sum]==id[17]) ;
			else {
				printf("%s\n",id);
				count=1; 
			}
		}
	}
	if(count==0) printf("All passed\n");
	return 0;
}
//简单题 但出现 难以发现的错误
//2019.09.11 

1072 开学寄语 (20 分)
下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其 QQ,封其电脑,夺其手机,收其 ipad,断其 wifi,使其百无聊赖,然后,净面、理发、整衣,然后思过、读书、锻炼、明智、开悟、精进。而后必成大器也!

本题要求你写个程序帮助这所学校的老师检查所有学生的物品,以助其成大器。

输入格式:
输入第一行给出两个正整数 N(≤ 1000)和 M(≤ 6),分别是学生人数和需要被查缴的物品种类数。第二行给出 M 个需要被查缴的物品编号,其中编号为 4 位数字。随后 N 行,每行给出一位学生的姓名缩写(由 1-4 个大写英文字母组成)、个人物品数量 K(0 ≤ K ≤ 10)、以及 K 个物品的编号。

输出格式:
顺次检查每个学生携带的物品,如果有需要被查缴的物品存在,则按以下格式输出该生的信息和其需要被查缴的物品的信息(注意行末不得有多余空格):

姓名缩写: 物品编号1 物品编号2 ……

最后一行输出存在问题的学生的总人数和被查缴物品的总数。

输入样例:

4 2
2333 6666
CYLL 3 1234 2345 3456
U 4 9966 6666 8888 6666
GG 2 2333 7777
JJ 3 0012 6666 2333

输出样例:

U: 6666 6666
GG: 2333
JJ: 6666 2333
3 5

#include<iostream>
using namespace std;
int main(){
	int n,m;
	int items[6],count=0;
	
	
	scanf("%d %d",&n,&m);
	for(int i=0;i<m;i++){
		scanf("%d",&items[i]);
	}
	
	char name[5];int k;int k_[10],temp;
	int a=0,b=0;
	
	for(int i=0;i<n;i++){
		scanf("%s %d",name,&k);
		count=0;
		for(int j=0;j<k;j++){
			scanf("%d",&temp);
			for(int t=0;t<m;t++){
				if(temp==items[t]){
					if(count){
						printf(" %04d",temp);
					}
					else{
						count=1;
						printf("%s: %04d",name,temp);
					}
					b++;
				}
			}
		}
		if(count) { printf("\n");a++;}
	}
	printf("%d %d\n",a,b);
	return 0;
} 
//简单题
//2019.09.12 

1038 统计同成绩学生 (20 分)
本题要求读入 N 名学生的成绩,将获得某一给定分数的学生人数输出。

输入格式:
输入在第 1 行给出不超过 105的正整数 N,即学生总人数。随后一行给出 N 名学生的百分制整数成绩,中间以空格分隔。最后一行给出要查询的分数个数 K(不超过 N 的正整数),随后是 K 个分数,中间以空格分隔。

输出格式:
在一行中按查询顺序给出得分等于指定分数的学生人数,中间以空格分隔,但行末不得有多余空格。

输入样例:

10
60 75 90 55 75 99 82 90 75 50
3 75 90 88

输出样例:

3 2 0

#include<iostream>
using namespace std;
int main(){
	int n,temp,score[101]={0};
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&temp);
		score[temp]++;
	}
	int k;
	scanf("%d",&k);
	for(int i=0;i<k;i++){
		scanf("%d",&temp);
		printf("%d",score[temp]);
		if(i!=k-1) printf(" ");
		else printf("\n"); 
	}
	return 0;
} 
//简单题
//2019.09.12 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值