【PAT】1011、1016、1026、1046、1008
阿新 • • 發佈:2018-11-08
/*專案: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; //最後雖然沒有移動數組裡的元素位置,但是打印出的結果
//是滿足題意的。
}