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中的数据由(A0A1⋯AN−1)变换为(A
N−M⋯AN−1 A0A1⋯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。
注意点
- 经测试,该题的指数都是非负整数,不存在负指数的情况。
- 对零次项的求导需要特判其直接为0。
- 在求导后,当前系数必须清空为0,否则可能后面无法被覆盖。
- 求导部分必须从低次项枚举到高次项,否则结果为出错。关于这点,不妨自己动手模拟一下从高次到低次进行枚举的过程。
- 如果求导之后没有任何非零项,需要输出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;
}