PAT练习集L1之五(15分档前6道)

15分档每一套里还是2道。但是还是不会很难,多少会涉及一点点算法(应该是这样的不然设置成15分就完全没有理由嘛)

然后每道题多少会写一点点题解并且还原一下当时的心路历程。

每一套里的两道15分难度我觉得差距不是很大,类型也不是很好分,在这里干脆就直接按顺序写了(还要向10分题那样分类确实多多少少有点浪费时间了 还是节省点时间做点更有意义的事情。。。。)

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
emm并不难,1000位的正整数,直接用字符串存储,然后从头遍历把每一个数字字符变成数字存储到另一个数组里++,
在这里提一下:数字字符变数字两种:1.数字字符-‘0’=数字;2.数字字符-48=数字(ASCII码内字符零值就是48)。

在输出的时候也要判断一下是否为0,不为0就输出,为0不做操作(既然要判断是否为0那么就要初始化)。

#include<bits/stdc++.h>

#define ms(a,x) memset(a,x,sizeof(a))
using namespace std;

typedef long long ll;

int main(){
	char a[1004];
	int  b[10];
	scanf("%s",a);
	ms(b,0);
	for(int i=0;i<strlen(a);i++){
		b[a[i]-48]++;
		
	}
	for(int i=0;i<10;i++){
		if(b[i]!=0){
			printf("%d:%d\n",i,b[i]);
		}
		
	}
	return 0;
}



L1-005. 考试座位号

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

输入格式:

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

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

输出格式:

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

输入样例:
4
10120150912233 2 4
10120150912119 4 1
10120150912126 1 3
10120150912002 3 2
2
3 4
输出样例:
10120150912002 2
10120150912119 1

N范围1000,M范围<n,时间复杂度O(n*m)<10^6,可以暴力,直接输入到结构体内,再按试机号遍历相同就输出考号和考试座位号。So easy。

#include<bits/stdc++.h>

#define ms(a,x) memset(a,x,sizeof(a))
using namespace std;

struct pp{
	ll num;
	int num1;
	int num2;
	
}stu[1005];
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>stu[i].num>>stu[i].num1>>stu[i].num2; 
	}
	int k;
	int q;
	cin>>k;
	while(k--){
		cin>>q;
		for(int i=0;i<n;i++){
			if(q==stu[i].num1){
				cout<<stu[i].num<<" "<<stu[i].num2<<endl;
				break;
			}
			
		}
	}
	return 0;
}

L1-015. 跟奥巴马一起画方块

美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!

输入格式:

输入在一行中给出正方形边长N(3<=N<=21)和组成正方形边的某种字符C,间隔一个空格。

输出格式:

输出由给定字符C画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的50%(四舍五入取整)。

输入样例:
10 a
输出样例:
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
还是格式控制的题,wa掉一发是错在:输出的行数实际上是列数的50%(四舍五入取整)
哪里有四舍,都是五入好不好,所以要判断是否为偶数,为偶直接除以2,不为偶直接除以2加1,然后循环输出。easy。
#include<bits/stdc++.h>

#define ms(a,x) memset(a,x,sizeof(a))
using namespace std;

typedef long long ll;

int main(){
	int n;
	char c;
	cin>>n>>c;
	int m;
	if(n%2==0)m=n/2;
	else m=n/2+1; 
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			cout<<c;
		}
		cout<<endl;
	}
	return 0;
}

L1-016. 查验身份证

一个合法的身份证号码由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<bits/stdc++.h>

#define ms(a,x) memset(a,x,sizeof(a))
using namespace std;

typedef long long ll;

int gcd(int a,int b){
	if(b==0)return a;
	return gcd(b,a%b);}
int lcm(int a,int b){
	return a/gcd(a,b)*b;}

int main(){
	
	char a[105][20];
	int c[17];
	int n;
	double b[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
	char m[11]={'1','0','X','9','8','7','6','5','4','3','2'};
	int  flag[105];
	bool flag1=true;
	cin>>n;
	ms(flag,0);
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	double zz=0.0;
	
	for(int i=0;i<n;i++){
		double zz=0.0;
		for(int j=0;j<17;j++){
			if(a[i][j]>='0'&&a[i][j]<='9'){
				zz+=(int)(a[i][j]-'0')*b[j];
			}
			else flag[i]=1;
		}
		//cout<<(int)zz%11<<' '<<m[(int)zz%11]<<endl;
		if(m[(int)zz%11]!=a[i][17])flag[i]=1;
		
	}
	for(int i=0;i<n;i++){
		if(flag[i]){
			flag1=false;cout<<a[i]<<endl;
		}
	}
	if(flag1)cout<<"All passed"<<endl;
	return 0;
}


L1-017. 到底有多二

一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字“-13142223336”是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11*1.5*2*100%,约为81.82%。本题就请你计算一个给定整数到底有多二。

输入格式:

输入第一行给出一个不超过50位的整数N。

输出格式:

在一行中输出N犯二的程度,保留小数点后两位。

输入样例:
-13142223336
输出样例:
81.82%

模拟。两个标志量,一个记录判断是否为负数,一个判断是否为偶数。最后按要求乘倍数。

对了,补充一句废话,需要注意是50位整数,一定是用数组了。

就这么简单的题感受一下当时有多弱智,现在我都还原不出来当时的心路历程        

正确代码:

#include<bits/stdc++.h>

#define ms(a,x) memset(a,x,sizeof(a))
using namespace std;

typedef long long ll;

int main(){
	char a[55];
	cin>>a;
	int len=strlen(a);
	double res=0;
	for(int i=0;i<len;i++){
		if(a[i]=='2')res++;
	}
	bool fs=false,ou=false;
	double ans=0;
	if((int)a[len-1]%2==0)ou=true;
	if(a[0]=='-')fs=true;
	if(fs){
		if(ou){
			ans=res/(len-1)*3.0;
		}
		else ans=res/(len-1)*1.5;
	}
	else {
		if(ou){
			ans=res/len*2.0;
		}
		else ans=res/len*1.0;
	}
	printf("%.2lf%%\n",ans*100);
	return 0;
}

L1-019. 谁先倒

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。

下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。

输入格式:

输入第一行先后给出甲、乙两人的酒量(不超过100的非负整数),以空格分隔。下一行给出一个正整数N(<=100),随后N行,每行给出一轮划拳的记录,格式为:

甲喊 甲划 乙喊 乙划

其中“喊”是喊出的数字,“划”是划出的数字,均为不超过100的正整数(两只手一起划)。

输出格式:

在第一行中输出先倒下的那个人:A代表甲,B代表乙。第二行中输出没倒的那个人喝了多少杯。题目保证有一个人倒下。注意程序处理到有人倒下就终止,后面的数据不必处理。

输入样例:
1 1
6
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
15 1 1 16
输出样例:
A
1

谁喊的谁划的要分清。需要注意的是:注意程序处理到有人倒下就终止。还是一道模拟。

#include<bits/stdc++.h>

#define ms(a,x) memset(a,x,sizeof(a))
using namespace std;

typedef long long ll;

int gcd(int a,int b){
	if(b==0)return a;
	return gcd(b,a%b);}
int lcm(int a,int b){
	return a/gcd(a,b)*b;}

int main(){
	int a,b;
	int a1,b1;
	int n;
	int t,ta[110],tb[110],qa[110],qb[110];
	int flag=1;
	cin>>a>>b;
	a1=a;b1=b;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>ta[i]>>qa[i]>>tb[i]>>qb[i];
	}
	int i;
	for(i=0;i<n;i++){
		t=ta[i]+tb[i];
		if(t==qa[i]&&t!=qb[i]){
			a--;
		}
		else if(t==qb[i]&&t!=qa[i]){
			b--;
		}
		if(a==-1){
			cout<<'A'<<endl;
			cout<< b1-b<<endl;
			break;
		}
		if(b==-1){
			cout<<'B'<<endl;
			cout<< a1-a<<endl;
			break;
		}
	}
	
	return 0;
}

前半部分结束,在考虑要不要一道题一个题解的文章,还是像这样6篇做一个总结。

一道题一篇确实超级酷啊,以后再看也会超级有成就感吧。。。等会试试?。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值