PAT练习集L1之六(15分题后六道)

15分题 后六道因为是按练习集的顺序所以有难有易,本来想一道题一篇的做,但还是感觉赶紧做完吧。刷题量已经停滞好久了。最好就是今天能把练习集L1都整完,然后明天就可以开始赶紧刷题补题了。


最近拉下的东西还有好多,都要慢慢补起来。还有半个月。恩,动起来。


L1-025. 正整数A+B

本题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。

输入格式:

输入在一行给出A和B,其间以空格分开。问题是A和B不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。

注意:我们把输入中出现的第1个空格认为是A和B的分隔。题目保证至少存在一个空格,并且B不是一个空字符串。

输出格式:

如果输入的确是两个正整数,则按格式“A + B = 和”输出。如果某个输入不合要求,则在相应位置输出“?”,显然此时和也是“?”。

输入样例1:
123 456
输出样例1:
123 + 456 = 579
输入样例2:
22. 18
输出样例2:
? + 18 = ?
输入样例3:
-100 blabla bla...33
输出样例3:
? + ? = ?

把当时交的代码翻出来一看就知道不是自己的东西。大概是当时为了加快进度,大致了解了题意试了试水发现不是很难但又不是那种能很快改对的题,所以就直接交了别人的题解。。emmm直接导致现在要重新来看这个题。

额仔细看了看题解大致意思是懂了,但是估计要让我重新来切这个题,我觉得我还是会跪。

虽然是一个很简单的模拟题,只需要将两个加数 在字符串改成数字的同时判断字符是否全部为数字,是否超过1000,哪个加数有问题就输出问号代替。但确确实实是想不到的方法。。。惭愧惭愧。

贴一下当时的正确代码(当时还在后面备注了自己的手撸的代码,看来当时是知道如今会有这么一出吧。。)

#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 fun(const char *str){
	int sum=0;
	for(int i=0;str[i]!='\0';i++){
		if(str[i]>='0'&&str[i]<='9')
			sum=sum*10+str[i]-'0';
		else return -1;
	}
	if(sum>=1&&sum<=1000)
		return sum;
	else return -1;
}	
char a[1000],b[1000];

int main(){
	int c=0,d=0;
	int aflag=1,bflag=1;
	scanf("%s ",a);
	gets(b);
	c=fun(a);
	d=fun(b);//cout<<c<< " "<<d<<endl;
	if(c==-1) printf("? + ");
	else printf("%d + ",c);
	if(d==-1) printf("? = ");
	else printf("%d = ",d);
	if(c==-1||d==-1) printf("?\n");
	else printf("%d\n",c+d);
		/*int len1=strlen(a);
		int len2=strlen(b);
		for(int i=0;i<len1;i++){
			if(a[i]<'0'||a[i]>'9'){
				aflag=0;break;
			}
		}
		for(int i=0;i<len2;i++){
			if(b[i]<'0'||b[i]>'9'){
				bflag=0;break;
			}
		}
		if(aflag==1&&bflag==1){
			c=0;d=0;
			int len11=len1-1;
			int len22=len2-1;
			for(int i=0;i<len1;i++){
				c=c*10+a[i]-'0';
			}
			for(int i=0;i<len2;i++){
				d=d*10+b[i]-'0';
			}
			if(c<=1000&&d<=1000)	printf("%s + %s = %d\n",a,b,c+d);
			else if(c<=1000&&d>1000)bflag=0;
			else if(c>1000&&d<=1000)aflag=0;
			else if(c>1000&&d >1000)aflag=0,bflag=0;
		}
		if(aflag==1&&bflag==0){
			printf("%s + ? = ?\n",a);
		}
		if(aflag==0&&bflag==1){
			printf("? + %s = ?\n",b);
		}
		if(aflag==0&&bflag==0){
			printf("? + ? = ?\n");
		}	*/		
	return 0;
}

L1-030. 一帮一

“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。

输入格式:

输入第一行给出正偶数N(<=50),即全班学生的人数。此后N行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。

输出格式:

每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。

输入样例:
8
0 Amy
1 Tom
1 Bill
0 Cindy
0 Maya
1 John
1 Jack
0 Linda
输出样例:
Amy Jack
Tom Linda
Bill Maya
Cindy John

很简单的一道模拟。

从头到中间遍历好学生,判断性别,然后从后到中间遍历坏学生。如果没有搭档切性别不同则输出切标记为有搭档。

#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;}

struct stu{
	int sex;
	char name[10];
}st[55];
int main(){
	int n;
	cin>>n;
	int vis[55];
	ms(vis,0);
	for(int i=0;i<n;i++){
		cin>>st[i].sex>>st[i].name;
	}
	for(int i=0;i<n/2;i++){
		cout<<st[i].name<<" ";
		for(int j=n-1;j>=n/2;j--){
			if(vis[j]==0&&st[j].sex!=st[i].sex){
				cout<<st[j].name<<endl;
				vis[j]=1;
				break;
			}
		}
	}

	return 0;
}

L1-033. 出生年

以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话。

输入格式:

输入在一行中给出出生年份y和目标年份中不同数字的个数n,其中y在[1, 3000]之间,n可以是2、或3、或4。注意不足4位的年份要在前面补零,例如公元1年被认为是0001年,有2个不同的数字0和1。

输出格式:

根据输入,输出x和能达到要求的年份。数字间以1个空格分隔,行首尾不得有多余空格。年份要按4位输出。注意:所谓“n个数字都不相同”是指不同的数字正好是n个。如“2013”被视为满足“4位数字都不同”的条件,但不被视为满足2位或3位数字不同的条件。

输入样例1:
1988 4
输出样例1:
25 2013
输入样例2:
1 2
输出样例2:
0 0001

这个题吼,特别有意义,因为我最开始想到的方法死活有一个样例过不去,然后我就全部改掉,重新暴力。之前的全部放弃。然后就过了!!!

这个暴力思想就是分类讨论n==2,3,4,三种情况。强行暴力。

#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 y,n;
	cin>>y>>n;
	int first = y;
	int a,b,c,d;
	int all[10];
	ms(all,0);
	
/*	for(int k=y;y<=3000;y++){
		a=y/1000;b=y/100%10;c=y/10%10;d=y%10;
		for(int i=0;i<10;i++){
			all[a]++;all[b]++;all[c]++;all[d]++;
		}
		int sum=0;
		for (int i = 0; i < 10; i++){
	        if (all[i]){
	        	sum++;
			}
		}
		ms(all,0);
		if(sum==n){
			cout<<y-k<<' ';
			cout<<a<<b<<c<<d<<endl;
			break;
		}
	}*/
		

	for(int i=y;;i++){
		if(n==4){
			int a,b,c,d;
			a=i/1000;b=i/100%10;c=i/10%10;d=i%10;
			if(a!=b&&a!=c&&a!=d&&b!=c&&b!=d&&c!=d){
				cout<<i-y<<' ';
				cout<<a<<b<<c<<d<<endl;
				break;
			}
		}
		if(n==3){
			int a,b,c,d;
			a=i/1000;b=i/100%10;c=i/10%10;d=i%10;
			if((a==b&a!=c&&a!=d&&c!=d)||(a==c&&a!=b&&a!=d&&b!=d)||
			(a==d&&a!=b&&a!=c&&b!=c)||(b==c&&b!=a&&b!=d&&a!=d)||
			(b==d&&b!=a&&b!=c&&a!=c)||(c==d&&c!=a&&c!=b&&a!=b)){
				cout<<i-y<<' ';
				cout<<a<<b<<c<<d<<endl;
				break;
			}	
		}
		if(n==2){
			int a,b,c,d;
			a=i/1000;b=i/100%10;c=i/10%10;d=i%10;
			if((a==b&&c==d&&b!=c)||(a==c&&b==d&&b!=c)||(a==d&&b==c&&b!=d)||
			(a==b&&b==c&&c!=d)||(a==b&&b==d&&d!=c)||(a==c&&a==d&&a!=b)||
			(b==c&&c==d&&d!=a)){
				cout<<i-y<<' ';
				cout<<a<<b<<c<<d<<endl;
				break;
			} 
		}
		
	}
	return 0;
}

L1-035. 情人节

以上是朋友圈中一奇葩贴:“2月14情人节了,我决定造福大家。第2个赞和第14个赞的,我介绍你俩认识…………咱三吃饭…你俩请…”。现给出此贴下点赞的朋友名单,请你找出那两位要请客的倒霉蛋。

输入格式:

输入按照点赞的先后顺序给出不知道多少个点赞的人名,每个人名占一行,为不超过10个英文字母的非空单词,以回车结束。一个英文句点“.”标志输入的结束,这个符号不算在点赞名单里。

输出格式:

根据点赞情况在一行中输出结论:若存在第2个人A和第14个人B,则输出“A and B are inviting you to dinner...”;若只有A没有B,则输出“A is the only one for you...”;若连A都没有,则输出“Momo... No one is for you ...”。

输入样例1:
GaoXZh
Magi
Einst
Quark
LaoLao
FatMouse
ZhaShen
fantacy
latesum
SenSen
QuanQuan
whatever
whenever
Potaty
hahaha
.
输出样例1:
Magi and Potaty are inviting you to dinner...
输入样例2:
LaoLao
FatMouse
whoever
.
输出样例2:
FatMouse is the only one for you...
输入样例3:
LaoLao
.
输出样例3:
Momo... No one is for you ...

模拟和字符串函数应用,三个容器,两个存2和14,一个存终止符‘.’。先判断是否终止,然后计数器i++,等于2存入,等于14存入。最后根据计数器大小输出。算简单的easy

#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 name[20];
	char name1[20],name2[20];
	int i=0;
	
	while(cin>>name){
		if(strcmp(name,".")==0)break;
		i++;
		if(i==2) strcpy(name1,name);
		if(i==14)strcpy(name2,name);
	}
	if(i>=14){
		printf("%s and %s are inviting you to dinner...",name1,name2);
	}
	else if(i<14&&i>=2){
		printf("%s is the only one for you...",name1);
	}
	else if(i<2){
		printf("Momo... No one is for you ...");
	}
	return 0;
}

L1-044. 稳赢

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

现要求你编写一个稳赢不输的程序,根据对方的出招,给出对应的赢招。但是!为了不让对方输得太惨,你需要每隔K次就让一个平局。

输入格式:

输入首先在第一行给出正整数K(<=10),即平局间隔的次数。随后每行给出对方的一次出招:“ChuiZi”代表“锤子”、“JianDao”代表“剪刀”、“Bu”代表“布”。“End”代表输入结束,这一行不要作为出招处理。

输出格式:

对每一个输入的出招,按要求输出稳赢或平局的招式。每招占一行。

输入样例:
2
ChuiZi
JianDao
Bu
JianDao
Bu
ChuiZi
ChuiZi
End
输出样例:
Bu
ChuiZi
Bu
ChuiZi
JianDao
ChuiZi
Bu

技巧只用判断字符数组a[0]是哪个然后对应输出即可。

坑点在要判断是不是一开始就是end。

#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 k;
  char a[100];
  cin>>k;
  int num=-1;
  while(cin>>a){
    
    if(a[0]=='E')break;
    num++;
      if(num==k){
        cout<<a<<endl;
        num=-1;
      }
      else {
        if(a[0]=='C')  cout<<"Bu"<<endl;
        else if(a[0]=='J')cout<<"ChuiZi"<<endl;
        else if(a[0]=='B')cout<<"JianDao"<<endl;
    }
    
  }
  return 0;
}

L1-048. 矩阵A乘以B

给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有Ra行、Ca列,B有Rb行、Cb列,则只有Ca与Rb相等时,两个矩阵才能相乘。

输入格式:

输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。

输出格式:

若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出“Error: Ca != Rb”,其中Ca是A的列数,Rb是B的行数。

输入样例1:
2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8
输出样例1:
2 4
20 22 24 16
53 58 63 28
输入样例2:
3 2
38 26
43 -5
0 17
3 2
-11 57
99 68
81 72
输出样例2:
Error: 2 != 3

刚看到这道题是懵逼的。因为线代61飘过的我是真的忘记了矩阵是怎么乘的了,仔细回忆了下下,然后按定义走了一遍格式错误。然后不知道怎么瞎改改就改A了。可喜可贺可喜可贺。

#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[100][100];
	int B[100][100];
	int ans[100][100];
	int ra,rb,ca,cb;
	cin>>ra>>ca;
	for(int i=0;i<ra;i++){
		for(int j=0;j<ca;j++){
			cin>>A[i][j];
		}
	}
	cin>>rb>>cb;
	for(int i=0;i<rb;i++){
		for(int j=0;j<cb;j++){
			cin>>B[i][j];
		}
	}
	if(ca!=rb)printf("Error: %d != %d",ca,rb);
	else {
		cout<<ra<<' '<<cb<<endl;
		for(int i=0;i<ra;i++){
			for(int j=0;j<cb;j++){
				int sum=0;
				for(int k=0;k<ca;k++){
					sum+=A[i][k]*B[k][j];	
				}
				if(j!=cb-1)printf("%d ",sum);
				else printf("%d",sum);	
			}
			cout<<endl;
		}
	}
	return 0;
}
/*2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8*/

还剩12道20分题,有模拟有贪心了。准备一道一道来了。很快的。加油!

题外话:做题解的时候,在讨论西安邀请赛派谁去,我其实也是想去的,花销大致400,500左右就可以提前去见识见识世面其实挺好的,但是还是怂,而且能力确实是差的多。。差太多了。基本上过去就是0封。还是算了吧。慢慢来先把基础补起来。

加油!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值