PTA练习题参考代码L1-003、005、009、011、020、023、027

一、L1-003 个位数统计

给定一个 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

代码:

void L1003(){
	string s;
	cin>>s;
	vector<int>ar(10);
	for(auto i : s){
		ar[i-48]++;
		
	}
	for(int i = 0;i<10;i++){
		if(ar[i]!=0){
			cout<<i<<":"<<ar[i]<<endl;
		}
	}
}

 

二、L1-005 考试座位号 

 

每个 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

 

代码:


typedef struct stu{
	string zh;
	int sj;
	int ks;
}S;

bool cmp(const S& a,const S& b){
	return a.sj<b.sj;
}

void L1005(){
	int n;
	cin>>n;
	vector<S>ar(n);
	for(int i=0;i<n;i++){
		cin>>ar[i].zh>>ar[i].sj>>ar[i].ks;
	}
	sort(ar.begin(),ar.end(),cmp);
	int m;
	cin>>m;
	while(m--){
		int a;
		cin>>a;
		cout<<ar[a-1].zh<<" "<<ar[a-1].ks<<endl;
	}
}

三、L1-009 N个数求和 

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1:

5
2/5 4/15 1/30 -2/60 8/3

输出样例1:

3 1/3

输入样例2:

2
4/3 2/3

输出样例2:

2

输入样例3:

3
1/3 -1/6 1/8

输出样例3:

7/24

代码: 

int gcd(int a,int c)
{
	while(c!=0)
	{
		int t=a%c;
		a=c;
		c=t;
	}
	return a;
}

void L1009(){
	int n;
	cin>>n;
	int fz = 0;
	int fm = 1;
	int a,b;
	for(int i=0;i<n;i++){
		scanf("%d/%d",&a,&b);
		fz = fz*b + a*fm;
		fm = b*fm;
		
		int yue = gcd(fm,fz);
		fz /=yue;
		fm/=yue;
	}
	
	int refz =(double(fz)/fm);//3
	
	if(fz%fm!=0&&refz!=0)
		cout<<refz<<" "<<fz-refz*fm<<"/"<<fm<<endl;
	else if(fz%fm==0&&refz!=0){
		cout<<refz<<endl;
	}else if(fz%fm!=0&&refz==0){
		cout<<fz-refz*fm<<"/"<<fm<<endl;
	}else
		cout<<refz<<endl;
}

四、L1-011 A-B 

本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。

输入格式:

输入在2行中先后给出字符串A和B。两字符串的长度都不超过104,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。

输出格式:

在一行中打印出A−B的结果字符串。

输入样例:

I love GPLT!  It's a fun game!
aeiou

输出样例:

I lv GPLT!  It's  fn gm!

代码:

void L1011(){
	string s,s1;
	getline(cin,s);
	getline(cin,s1);
	
	for(int i = 0;i < s.size();i++){
		if(!(s1.find(s[i])!=string::npos)){
			cout<<s[i];
		}
	}
}

五、L1-020 帅到没朋友 

当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。

输入格式:

输入第一行给出一个正整数N(≤100),是已知朋友圈的个数;随后N行,每行首先给出一个正整数K(≤1000),为朋友圈中的人数,然后列出一个朋友圈内的所有人——为方便起见,每人对应一个ID号,为5位数字(从00000到99999),ID间以空格分隔;之后给出一个正整数M(≤10000),为待查询的人数;随后一行中列出M个待查询的ID,以空格分隔。

注意:没有朋友的人可以是根本没安装“朋友圈”,也可以是只有自己一个人在朋友圈的人。虽然有个别自恋狂会自己把自己反复加进朋友圈,但题目保证所有K超过1的朋友圈里都至少有2个不同的人。

输出格式:

按输入的顺序输出那些帅到没朋友的人。ID间用1个空格分隔,行的首尾不得有多余空格。如果没有人太帅,则输出No one is handsome

注意:同一个人可以被查询多次,但只输出一次。

输入样例1:

3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888

输出样例1:

10000 88888 23333

输入样例2:

3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
4
55555 44444 22222 11111

输出样例2:

No one is handsome

代码:

void L1020(){
	int n,m;
	cin>>n;
	set<int>res;
	bool ar[1000000] = {false};
	for(int i=0;i<n;i++){
		cin>>m;
		int c;
		if(m==1){
			cin>>c;
			continue;
		}else{
			for(int j=0;j<m;j++){
				cin>>c;
				ar[c] = true;
			}
		}
	}
	int cn;
	cin>>cn;
	bool flag = false;
	for(int i=0;i<cn;i++){
		int a;
		cin>>a;
		if(res.count(a)||ar[a]==false){
			if(!flag){
				flag =true;
				cout<<setw(5)<<setfill('0')<<a;
			}else{
				cout<<" ";
				cout<<setw(5)<<setfill('0')<<a;
			}
			ar[a] = true;
		}
		
	}
	if(!flag){
		cout<<"No one is handsome";
	}
	
}

六、L1-023 输出GPLT 

给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT的顺序打印,直到所有字符都被输出。

输入格式:

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

输出格式:

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

输入样例:

pcTclnGloRgLrtLhgljkLhGFauPewSKgt

输出样例:

GPLTGPLTGLTGLGLL

代码: 

 

void L1023(){
	string s;
	cin>>s;
	vector<int>ar(4);//GPLT
	for(auto i:s){
		if(i=='G'||i=='g'){
			ar[0]++;
		}else if(i=='P'||i=='p'){
			ar[1]++;
		}else if(i=='L'||i=='l'){
			ar[2]++;
		}else if(i=='T'||i=='t'){
			ar[3]++;
		}
		
	}
	char cs[]={'G','P','L','T'};
	for(int i = 0;;i++){
		if(ar[i%4]>0){
			cout<<cs[i%4];
			ar[i%4]--;
		}
		if(ar[0]==0&&ar[1]==0&&ar[2]==0&&ar[3]==0){
			break;
		}
	}
}

七、L1-027 出租 

下面是新浪微博上曾经很火的一张图:

一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1index[1]=0 对应 arr[0]=8index[2]=3 对应 arr[3]=0,以此类推…… 很容易得到电话号码是18013820100

本题要求你编写一个程序,为任何一个电话号码生成这段代码 —— 事实上,只要生成最前面两行就可以了,后面内容是不变的。

输入格式:

输入在一行中给出一个由11位数字组成的手机号码。

输出格式:

为输入的号码生成代码的前两行,其中arr中的数字必须按递减顺序给出。

输入样例:

18013820100

输出样例:

int[] arr = new int[]{8,3,2,1,0};
int[] index = new int[]{3,0,4,3,1,0,2,4,3,4,4};

代码:

void L1027(){
	string s;
	vector<int>num;
	bool numid[10]={false};
	cin>>s;
	for(auto i :s){
		if(numid[i-48]==false){
			numid[i-48]=true;
			num.push_back(i-48);
		}
	}
	sort(num.begin(),num.end(),cmp1);
	vector<int> index;
	for(auto i : s){
		vector<int>::iterator x = lower_bound(num.begin(),num.end(),i-48,cmp2);
		
		index.push_back(distance(num.begin(),x)-1);
	}
	cout<<"int[] arr = new int[]{"<<num[0];
	for(int i=1;i<num.size();i++){
		cout<<","<<num[i];
	}
	cout<<"};"<<endl;
	cout<<"int[] index = new int[]{"<<index[0];
	for(int i=1;i<index.size();i++){
		cout<<","<<index[i];
	}
	cout<<"};";

	
}

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像污秽一样

谢谢谢谢谢谢谢谢谢谢谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值