B1001.害死人不償命的(3n+1)猜想 (15)
Description:
卡拉茲(Callatz)猜想:
對任何一個自然數n,如果它是偶數,那麼把它砍掉一半;如果它是奇數,那麼把(3n+1)砍掉一半。這樣一直反復砍下去,最後一定在某一步得到n=1。卡拉茲在1950年的世界數學家大會上公布了這個猜想,傳說當時耶魯大學師生齊動員,拼命想證明這個貌似很傻很天真的命題,結果鬧得學生們無心學業,一心只證(3n+1),以至於有人說這是一個陰謀,卡拉茲是在蓄意延緩美國數學界教學與科研的進展……
我們今天的題目不是證明卡拉茲猜想,而是對給定的任一不超過1000的正整數n,簡單地數一下,需要多少步(砍幾下)才能得到n=1?
Input:
每個測試輸入包含1個測試用例,即給出自然數n的值。
Output:
輸出從n計算到1需要的步數。
Sample Input:
3
Sample Output:
5
1 #include <cstdio> 2 3 int main() 4 { 5 //freopen("E:\\Temp\\input.txt", "r", stdin); 6 7 int n, step = 0; 8 scanf("%d", &n); 9 10 while(n != 1) { 11 if(n%2 == 0) { 12 n /= 2; 13 } else { 14 n = (3*n+1)/2; 15 } 16 step++; 17 } 18 19 printf("%d\n", step); 20 21 return 0; 22 }
B1032. 挖掘機技術哪家強 (20)
Description:
為了用事實說明挖掘機技術到底哪家強,PAT組織了一場挖掘機技能大賽。現請你根據比賽結果統計出技術最強的那個學校。
Input:
輸入在第1行給出不超過105的正整數N,即參賽人數。隨後N行,每行給出一位參賽者的信息和成績,包括其所代表的學校的編號(從1開始連續編號)、及其比賽成績(百分制),中間以空格分隔。
Output:
在一行中給出總得分最高的學校的編號、及其總分,中間以空格分隔。題目保證答案唯一,沒有並列。
Sample Input:
6
3 65
2 80
1 100
2 70
3 40
3 0
Sample Output:
2 150
1 #include <cstdio> 2 3 #define MaxSize 100010 4 5 int school[MaxSize]; 6 7 int main() 8 { 9 //freopen("E:\\Temp\\input.txt", "r", stdin); 10 11 int n, schID, score; 12 scanf("%d", &n); 13 for(int i=0; i<n; ++i) { 14 scanf("%d %d", &schID, &score); 15 school[schID] += score; 16 } 17 18 int ID, maxscore = -1; 19 for(int i=1; i<=n; ++i) { 20 if(school[i] > maxscore) { 21 ID = i; 22 maxscore = school[i]; 23 } 24 } 25 26 printf("%d %d\n", ID, maxscore); 27 }
B1011. A+B和C (15)
Description:
給定區間[-231, 231]內的3個整數A、B和C,請判斷A+B是否大於C。
Input:
輸入第1行給出正整數T(<=10),是測試用例的個數。隨後給出T組測試用例,每組占一行,順序給出A、B和C。整數間以空格分隔。
Output:
對每組測試用例,在一行中輸出“Case #X: true”如果A+B>C,否則輸出“Case #X: false”,其中X是測試用例的編號(從1開始)。
Sample Input:
4
1 2 3
2 3 4
2147483647 0 2147483646
0 -2147483648 -2147483647
Sample Output:
Case #1: false
Case #2: true
Case #3: true
Case #4: false
1 #include <cstdio> 2 3 int main() 4 { 5 //freopen("E:\\Temp\\input.txt", "r", stdin); 6 7 int T; 8 long long a, b, c; 9 scanf("%d", &T); 10 for(int i=1; i<=T; ++i) { 11 scanf("%lld %lld %lld", &a, &b, &c); 12 if(a+b > c) { 13 printf("Case #%d: true\n", i); 14 } else { 15 printf("Case #%d: false\n", i); 16 } 17 } 18 19 return 0; 20 }
B1016. 部分A+B (15)
Description:
正整數A的“DA(為1位整數)部分”定義為由A中所有DA組成的新整數PA。例如:給定A = 3862767,DA = 6,則A的“6部分”PA是66,因為A中有2個6。
現給定A、DA、B、DB,請編寫程序計算PA + PB。
Input:
輸入在一行中依次給出A、DA、B、DB,中間以空格分隔,其中0 < A, B < 1010。
Output:
在一行中輸出PA + PB的值。
Sample Input1:
3862767 6 13530293 3
Sample Output1:
399
Sample Input2:
3862767 1 13530293 8
Sample Output2:
0
1 #include <cstdio> 2 3 int main() 4 { 5 //freopen("E:\\Temp\\input.txt", "r", stdin); 6 7 int Da, Db; 8 long long pA = 0, pB = 0, A, B; 9 scanf("%lld %d %lld %d", &A, &Da, &B, &Db); 10 11 while(A != 0) { 12 if(A%10 == Da) { 13 pA = pA*10+Da; 14 } 15 A /= 10; 16 } 17 while(B != 0) { 18 if(B%10 == Db) { 19 pB = pB*10+Db; 20 } 21 B /= 10; 22 } 23 24 printf("%lld\n", pA+pB); 25 26 return 0; 27 }
B1026. 程序運行時間 (15)
Description:
要獲得一個C語言程序的運行時間,常用的方法是調用頭文件time.h,其中提供了clock()函數,可以捕捉從程序開始運行到clock()被調用時所耗費的時間。這個時間單位是clock tick,即“時鐘打點”。同時還有一個常數CLK_TCK,給出了機器時鐘每秒所走的時鐘打點數。於是為了獲得一個函數f的運行時間,我們只要在調用f之前先調用clock(),獲得一個時鐘打點數C1;在f執行完成後再調用clock(),獲得另一個時鐘打點數C2;兩次獲得的時鐘打點數之差(C2-C1)就是f運行所消耗的時鐘打點數,再除以常數CLK_TCK,就得到了以秒為單位的運行時間。
這裡不妨簡單假設常數CLK_TCK為100。現給定被測函數前後兩次獲得的時鐘打點數,請你給出被測函數運行的時間。
Input:
輸入在一行中順序給出2個整數C1和C1。注意兩次獲得的時鐘打點數肯定不相同,即C1 < C2,並且取值在[0, 107]。
Output:
在一行中輸出被測函數運行的時間。運行時間必須按照“hh:mm:ss”(即2位的“時:分:秒”)格式輸出;不足1秒的時間四捨五入到秒。
Sample Input:
123 4577973
Sample Output:
12:42:59
1 #include <cstdio> 2 3 int main() 4 { 5 //freopen("E:\\Temp\\input.txt", "r", stdin); 6 7 int C1, C2; 8 scanf("%d %d", &C1, &C2); 9 10 int ans = C2 - C1; 11 if(ans%100 < 50) { 12 ans /= 100; 13 } else { 14 ans = ans/100+1; 15 } 16 17 printf("%02d:%02d:%02d\n", ans/3600, ans%3600/60, ans%60); 18 19 return 0; 20 }
B1008. 數組元素循環右移問題 (20)
Description:
一個數組A中存有N(N>0)個整數,在不允許使用另外數組的前提下,將每個整數循環向右移M(M>=0)個位置,即將A中的數據由(A0A1……AN-1)變換為(AN-M …… AN-1 A0 A1……AN-M-1)(最後M個數循環移至最前面的M個位置)。如果需要考慮程序移動數據的次數盡量少,要如何設計移動的方法?
Input:
每個輸入包含一個測試用例,第1行輸入N ( 1<=N<=100)、M(M>=0);第2行輸入N個整數,之間用空格分隔。
Output:
在一行中輸出循環右移M位以後的整數序列,之間用空格分隔,序列結尾不能有多余空格。
Sample Input:
6 2
1 2 3 4 5 6
Sample Output:
5 6 1 2 3 4
1 #include <cstdio> 2 3 #define MaxSize 110 4 5 int List[MaxSize]; 6 7 int main() 8 { 9 //freopen("E:\\Temp\\input.txt", "r", stdin); 10 11 int N, M, counter = 1; 12 scanf("%d %d", &N, &M); 13 for(int i=0; i<N; ++i) { 14 scanf("%d", &List[i]); 15 } 16 17 M %= N; 18 for(int i=N-M; i<N; ++i) { 19 if(counter != N) { 20 printf("%d ", List[i]); 21 } else { 22 printf("%d\n", List[i]); 23 } 24 counter++; 25 } 26 for(int i=0; i<N-M; ++i) { 27 if(counter != N) { 28 printf("%d ", List[i]); 29 } else { 30 printf("%d\n", List[i]); 31 } 32 counter++; 33 } 34 35 return 0; 36 }
B1012. 數字分類 (20)
Description:
定一系列正整數,請按要求對數字進行分類,並輸出以下5個數字:
Input:
每個輸入包含1個測試用例。每個測試用例先給出一個不超過1000的正整數N,隨後給出N個不超過1000的待分類的正整數。數字間以空格分隔。
Output:
對給定的N個正整數,按題目要求計算A1~A5並在一行中順序輸出。數字間以空格分隔,但行末不得有多余空格。
若其中某一類數字不存在,則在相應位置輸出“N”。
Sample Input1:
13 1 2 3 4 5 6 7 8 9 10 20 16 18
Sample Output1:
30 11 2 9.7 9
Sample Input2:
8 1 2 4 5 6 7 9 16
Sample Output2:
N 11 2 N 9
1 #include <cstdio> 2 3 #define MaxSize 5 4 5 int List[MaxSize], ans[MaxSize]; 6 7 int main() 8 { 9 //freopen("E:\\Temp\\input.txt", "r", stdin); 10 11 int N, temp; 12 scanf("%d", &N); 13 for(int i=0; i<N; ++i) { 14 scanf("%d", &temp); 15 if(temp%5 == 0) { 16 if(temp%2 == 0) { 17 ans[0] += temp; 18 List[0]++; 19 } 20 } else if(temp%5 == 1) { 21 if(List[1]%2 == 0) { 22 ans[1] += temp; 23 } else { 24 ans[1] -= temp; 25 } 26 List[1]++; 27 } else if(temp%5 == 2) { 28 List[2]++; 29 } else if(temp%5 == 3) { 30 ans[3] += temp; 31 List[3]++; 32 } else { 33 if(temp > ans[4]) { 34 ans[4] = temp; 35 } 36 List[4]++; 37 } 38 } 39 40 if(List[0] == 0) { 41 printf("N "); 42 } else { 43 printf("%d ", ans[0]); 44 } 45 if(List[1] == 0) { 46 printf("N "); 47 } else { 48 printf("%d ", ans[1]); 49 } 50 if(List[2] == 0) { 51 printf("N "); 52 } else { 53 printf("%d ", List[2]); 54 } 55 if(List[3] == 0) { 56 printf("N "); 57 } else { 58 printf("%.1f ", (double)ans[3]/List[3]); 59 } 60 if(List[4] == 0) { 61 printf("N\n"); 62 } else { 63 printf("%d\n", ans[4]); 64 } 65 66 return 0; 67 }