PAT (Basic Level) Practice (中文)入门篇(3)C

1026 程序运行时间 (15分)

要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间。这个时间单位是 clock tick,即“时钟打点”。同时还有一个常数 CLK_TCK,给出了机器时钟每秒所走的时钟打点数。于是为了获得一个函数 f 的运行时间,我们只要在调用 f 之前先调用 clock(),获得一个时钟打点数 C1;在 f 执行完成后再调用 clock(),获得另一个时钟打点数 C2;两次获得的时钟打点数之差 (C2-C1) 就是 f 运行所消耗的时钟打点数,再除以常数 CLK_TCK,就得到了以秒为单位的运行时间。

这里不妨简单假设常数 CLK_TCK 为 100。现给定被测函数前后两次获得的时钟打点数,请你给出被测函数运行的时间。

输入格式:
输入在一行中顺序给出 2 个整数 C1 和 C2。注意两次获得的时钟打点数肯定不相同,即 C1 < C2,并且取值在 [0,10^​7​​ ]。

输出格式:
在一行中输出被测函数运行的时间。运行时间必须按照 hh:mm:ss(即2位的 时:分:秒)格式输出;不足 1 秒的时间四舍五入到秒。

输入样例:

123 4577973

输出样例:

12:42:59

原题链接
思考

  • 题意为给出C1和C2,单位均为CLK_TCK(100CLK_TCK=1s),求C1与C2相距的时间,结果按四舍五入精确到秒
  • 先求C2-C1,进行四舍五入求解 ,结果为ans
  • 由于1h=3600s ,ans/3600即为小时数。于是ans%3600是求小时数后的剩余部分,再除以60即分钟数,ans模上60即为秒
  • 四舍五入可用math.h头文件的round函数,输出的不足两位,高用零补齐
#include <stdio.h>
int main(){
	int C1,C2,ans=0;
	scanf("%d %d",&C1,&C2);
	ans=C2-C1; //按题目要求求差
	if(ans%100>=50){ //四舍五入 
		ans=ans/100+1;
	}else{
		ans=ans/100;
	}	
	printf("%02d:%02d:%02d\n",ans/3600,ans%3600/60,ans%60); 
	return 0;
} 

1046 划拳 (15分)

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

下面给出甲、乙两人的划拳记录,请你统计他们最后分别喝了多少杯酒。

输入格式:
输入第一行先给出一个正整数 N(≤100),随后 N 行,每行给出一轮划拳的记录,格式为:

甲喊 甲划 乙喊 乙划

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

输出格式:
在一行中先后输出甲、乙两人喝酒的杯数,其间以一个空格分隔。

输入样例:

5
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15

输出样例:

1 2

原题链接
思考

  • 题意为同时喊出两个数字a1,a2,且同时比划两个数字b1,b2;
  • 谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒
  • 两人同赢或两人同输则继续下一轮,统计两人各自的杯数c1,c2
  • 如果a1+a2=b1且a1+a2!=b2,乙输;同理,a1+a2=b2且a1+a2!=b1,甲输
  • 注意如果两人都猜不中则不计数
#include <stdio.h>
int main(){
	int N,a1,b1,a2,b2; 
	int i,c1=0,c2=0;
	scanf("%d",&N);
	for(i=0;i<N;i++){
		scanf("%d %d %d %d",&a1,&b1,&a2,&b2);
		if(a1+a2==b1&&a1+a2!=b2)	c2++;
		if(a1+a2==b2&&a1+a2!=b1)	c1++;
	}
	printf("%d %d\n",c1,c2);
	return 0;
}

1008 数组元素循环右移问题 (20分)

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A​0A​1⋯A​N−1)变换为(A
​N−M⋯A​N−1 A​0A​1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例:

6 2
1 2 3 4 5 6

输出样例:

5 6 1 2 3 4

原题链接
思考

  • 需要注意M的值,不能认定 M<N ,需要在读入M,N后令 M=M%N,即 M<N ,
  • 这样使一个长为N的新序列,在右移N位后与原序列长度相同,
  • 这即可得到一个新M,可直接输出N-M号元素到N-1号元素,再输出0号元素到 N-M-1号元素即可
  • 注意格式、运行超时
#include <stdio.h>
int main(){
	int N,M,i,str[100],num=0;
	scanf("%d %d",&N,&M);
	M=M%N; //修正m 
	for(i=0;i<N;i++){
		scanf("%d",&str[i]);
	}
	for(i=N-M;i<N;i++){ //输出 N-M到 N-1号元素 
		printf("%d",str[i]);
		num++; 
		if(num<N) printf(" ");
	}
	for(i=0;i<N-M;i++){ //输出 0 ~~ N-M-1 号元素 
		printf("%d",str[i]);
		num++;
		if(num<N) printf(" "); 
	} 
	return 0;
} 

1010 一元多项式求导 (25分)

设计函数求一元多项式的导数。(注:x^​n(n为整数)的一阶导数为 nx^n−1。)

输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。

输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。

输入样例:

3 4 -5 2 6 1 -2 0

输出样例:

12 3 -10 1 6 0

原题链接
思考

  • 只需读入多项系数n,与指数m,
  • 如果指数为不为0,则输出求导后的指数与系数,即 n*m,m-1;
  • 因为格式问题,需先输出空格
  • 注意“零多项式”的指数和系数都是 0,则表示为 0 0。

注意点

  1. 经测试,该题的指数都是非负整数,不存在负指数的情况。
  2. 对零次项的求导需要特判其直接为0。
  3. 在求导后,当前系数必须清空为0,否则可能后面无法被覆盖。
  4. 求导部分必须从低次项枚举到高次项,否则结果为出错。关于这点,不妨自己动手模拟一下从高次到低次进行枚举的过程。
  5. 如果求导之后没有任何非零项,需要输出00,这是本题的一个“陷阱“。
#include <stdio.h>
int main(){
	int n,m,count=0;
	while(scanf("%d %d",&n,&m)!=EOF){
		if(m){
			if(count++) printf(" "); 
			printf("%d %d",n*m,m-1);
		} 
	} 
	if(count==0) printf("0 0");
	return 0;
}

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

原题链接
思考

  • 网上大多数使用的是结构体,但我读完题后,按题要求发现未必一定要结构体,
  • 在Dev-C++中输出不对,但能通过PTA考试机 emmmmm~
  • 只需要判断带查询的试机座位号与输入的试机座位号相等,则输出另外两个号码,跳出循环即可
#include <stdio.h>
int main(){
	int N,M,shi,i,j; //N个编号,M个待查寻号,shi是试机座位号 
	scanf("%d",&N);
	long long zhun[N],zuo[N],kao[N];
	for(i=0;i<N;i++){
		scanf("%lld %lld %lld",&zhun[i],&zuo[i],&kao[i]);
	} 
	scanf("%d",&M);
	for(i=0;i<M;i++){
		scanf("%d",&shi);
		for(j=0;j<N;j++){
			if(zuo[j]==shi){
				printf("%lld %lld\n",zhun[j],kao[j]);
				break;
			} 
		}
	}
	return 0;
} 

star

发布了32 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/m0_46153949/article/details/104073357