【PAT】1011、1016、1026、1046、1008


/*项目:PAT (1011)给定区间[-231, 231]内的3个整数A、B和C,请判断A+B是否大于C
 *作者:钱金柱
 *日期:2018年4月7日 19:34
 */

#include<stdio.h>

int main(void)
{
	int i, j, T, temp;
	
	
	scanf("%d\n", &T);  
	long long a[T][3];
	temp = T - 1;
	
	for(i = 0; i <= temp; i++)
		for(j = 0; j <= 2;j++)
			scanf("%lld", &a[i][j]);

	for(i = 0; i <= temp; i++)
	{
		if(a[i][0] + a[i][1] > a[i][2])
			printf("Case #%d: true", i+1);
		else
			printf("Case #%d: false", i+1);
		printf("\n");
	}	
	return 0;
}

/*题号:1016. 部分A+B (15)
 *作者:钱金柱
 *日期:2018年4月7日 22:32
 *题目描述:正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA。
            现给定A、DA、B、DB,请编写程序计算PA + PB。
            输入格式:
            输入在一行中依次给出A、DA、B、DB,中间以空格分隔,其中0 < A, B < 1010。
            输出格式:
            在一行中输出PA + PB的值。
            输入样例1:
            3862767 6 13530293 3
            输出样例1:
            399
            输入样例2:
            3862767 1 13530293 8
            输出样例2:
            0
 */
 
 
 #include<stdio.h>
 
 int main()
 {
	 int A, DA;
	 int B, DB;
	 int PA, PB;
	 int temp;
	 PA = 0;
	 PB = 0;
	 scanf("%d %d %d %d", &A, &DA, &B, &DB);
	 
	 while(A != 0)
	 {
		 temp = A % 10;
		 A /= 10;
		 if(temp == DA)
			 PA = PA * 10 + DA;
			 
	 }
	  while(B != 0)
	 {
		 temp = B % 10;
		 B /= 10;
		 if(temp == DB)
			 PB = PB * 10 + DB;
			 
	 }
	 
	 printf("%d\n", PA + PB);
	 
	 return 0;
 }
 

/*题号:1026. 程序运行时间(15)
 *作者:钱金柱
 *日期:2018年4月8日 9:55
 *题目描述:要获得一个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, 107]。

			输出格式:

			在一行中输出被测函数运行的时间。运行时间必须按照“hh:mm:ss”(即2位的“时:分:秒”)格式
			输出;不足1秒的时间四舍五入到秒。
			输入样例:
			123 4577973
			输出样例:
			12:42:59
 */
 
#include<stdio.h>
#define CLK_TCK 100
 
int main()
 {  
 
    int C1, C2;
	double t = 0;
	double times;         //注意定义的数据类型与下面需求相匹配
	double temp;
	int ss = 0;
	int mm = 0;
	int hh = 0;
	 
	scanf("%d", &C1);
	scanf("%d", &C2);

	t = (C2 - C1);
	times = t / CLK_TCK;    //错误:times = (C2 - C1) / CLK_TCK,后面计算出的结果,
	                        //以整形存储在times里面
	//printf("%lf\n",times);
	temp = times - (int)times;
	//printf("%lf\n",temp);
	if(temp >= 0.5)
		ss = (int)times + 1;
	else
		ss = (int)times;
	 
	hh = ss / 3600;
	mm = (ss - 3600 * hh) / 60;
	ss = ss - 3600 *hh - 60 * mm;
	
	printf("%02d:%02d:%02d\n", hh, mm, ss);
	
	return 0;
		 
		 
 }
/*题号:1046. 划拳(15)
 *作者:钱金柱
 *日期:2018年4月8日 14:19
 *题目描述:划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。

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

  输入格式:

  输入第一行先给出一个正整数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

 */

#include<stdio.h>
#define Debug 0
int main()
{
	int drink1 = 0;
	int	drink2 = 0;
	int N;
	
	int i, j;
	
	scanf("%d", &N);
	int a[N][4];
	for(i = 0; i <= (N - 1); i++)
	{
		for(j = 0; j <= 3; j++)
		{
			scanf("%d", &a[i][j]);
		}
	}
	if (Debug) for(i = 0; i <= (N - 1); i++)
	{
		for(j = 0; j <= 3; j++)
		{
			printf("%d ", a[i][j]);
		}
	}
	for(i = 0; i <= (N - 1); i++)
	{
		
		if((a[i][0] + a[i][2] == a[i][1]) && (a[i][0] + a[i][2] == a[i][3]))
		{
			if (Debug) printf("xiangtong");
			continue;
		}

		else if(a[i][0] + a[i][2] == a[i][3])
			drink1 += 1;
		else if(a[i][0] + a[i][2] == a[i][1])
			drink2 += 1;
			
	}
	
	printf("%d %d\n", drink1, drink2);
	
	return 0;
}
/*题号:1008. 数组元素循环右移问题 (20)
 *作者:钱金柱
 *日期:2018年4月9日 22:30
 *题目描述:一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数
  循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1……AN-1)变换为(AN-M …… AN-1 A0 A1……AN-M-1)
 (最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

  输入格式:每个输入包含一个测试用例,第1行输入N ( 1<=N<=100)、M(M>=0);第2行输入N个整数,
  之间用空格分隔。
  输出格式:在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

  输入样例:
  6 2
  1 2 3 4 5 6
  输出样例:
  5 6 1 2 3 4
 */

#include<stdio.h>


int main(void)
{
	int N;
	int M;
	int i;
	int T;
	
	scanf("%d", &N);
	scanf("%d", &M);
	
	int a[N];
	
	for(i = 0; i < N; i++)
	{
		scanf("%d", &a[i]);
	
	}
	
	/*
	for(i = 0; i < N; i++)
	{
		printf("%d \n", a[i]);                 //代码调试
	}
	printf("%d", N-M);
	*/
	if(N > M)                                       //第一种情况 N 大于 M
	{
		for(i = N - M; i <= (N - 1); i++)       
		{
			printf("%d ", a[i]);            //先打印出a[N-M]--a[N-1],注意每次打印数组中的元素
		                                        //都留一个空格
		}                                       
		
		for(i =0; i <= (N - M - 2); i++)
		{
			printf("%d ", a[i]);            //再打印出a[0]--a[N-M-2]
			
		}
		printf("%d\n", a[N - M - 1]); 	       //为什么要单独打印最后一个数呢?根据题目要求序列最后
	                                               //不能留空格,故满足格式要求,单独打印a[N-M-1]
	}
	else if(N <= M)                                //第二种情况:M 大于等于 N
	{
		                         
		/*
		for(T = M - N; T > N; T = T - N)      //等效于T = M % N;(错)  
		{                                     
			continue;                     //调试发现这样做存在一个测试点是有问题的
		}                                     //有心的人可以考虑下
		*/
	
		
		T = M % N;                           //比起上面用一个循环来做,这样更加节省时间
		                                     //数组元素每次向右移动 N 的整数倍,整个数组没变,
		                                     //因此用T = M % N 确定最后移动的次数T,这个数比N
						     //小,相当于第一种情况下M,下面打印数组就是重复一下。
		for(i = N - T; i <= (N - 1); i++)
		{
			printf("%d ", a[i]);
		}
	
		for(i =0; i <= (N - T - 2); i++)
		{
			printf("%d ", a[i]);
		}	
		printf("%d\n", a[N - T - 1]);
	}
	
	return 0;                                 //最后虽然没有移动数组里的元素位置,但是打印出的结果
	                                          //是满足题意的。
}





猜你喜欢

转载自blog.csdn.net/weixin_40597998/article/details/79880232
今日推荐