1. 程式人生 > >【PAT】1011、1016、1026、1046、1008

【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;                                 //最後雖然沒有移動數組裡的元素位置,但是打印出的結果
	                                          //是滿足題意的。
}