4.1 break語句和continue語句
在多重循環的情況下,break語句只能跳出直接包含它的那一重循環,continue只對直接包含它的那重循環起作用。
4.2 OJ輸入數據的處理
scanf(...)表達式的值為int,表示成功讀入的變量個數,匹配不成功時直接停止掃描,值為EOF(即-1)時說明輸入數據已經結束。
4.3 用freopen重定向輸入
freopen函數以指定模式重新指定到另一個文件,模式用於指定新文件的訪問方式。
FILE *freopen(const char * restrict filename, const char * restrict mode, FILE * restrict stream);
filename:文件名或文件路徑,mode:文件訪問權限字符串("r"只讀,“w”只寫,“a”追加寫入),steam:需要被重定向的文件流。
eg:freopen("c:\\tmp\\test.txt", "r", stdin);
作業
1.角谷猜想
Description:
所謂角谷猜想,是指對於任意一個正整數,如果是奇數,則乘3加1,如果是偶數,則除以2,得到的結果再按照上述規則重復處理,最終總能夠得到1。如,假定初始整數為5,計算過程分別為16、8、4、2、1。
程序要求輸入一個整數,將經過處理得到1的過程輸出來。
Input:一個正整數N(N <= 2,000,000)
Output:從輸入整數到1的步驟,每一步為一行,每一部中描述計算過程。最后一行輸出"End"。如果輸入為1,直接輸出"End"。
Sample Input:5
Sample Output:
5*3+1=16
16/2=8
8/2=4
4/2=2
2/2=1
End
1 #include <cstdio>
2
3 int main() 4 { 5 long long N; 6 scanf("%lld", &N); 7
8 while(N != 1) { 9 long long t; 10 if(N % 2) { 11 t = N*3+1; 12 printf("%lld*3+1=%lld\n", N, t); 13 } 14 else { 15 t = N/2; 16 printf("%lld/2=%lld\n", N, t); 17 } 18 N = t; 19 } 20 printf("End\n"); 21
22 return 0; 23 }
2.正常血壓
Description:
監護室每小時測量一次病人的血壓,若收縮壓在90 - 140之間並且舒張壓在60 - 90之間(包含端點值)則稱之為正常,現給出某病人若干次測量的血壓值,計算病人保持正常血壓的最長小時數。
Input:
第一行為一個正整數n,n < 100
其后有n行,每行2個正整數,分別為一次測量的收縮壓和舒張壓,中間以一個空格分隔。
OutPut:輸出僅一行,血壓連續正常的最長小時數。
Sample Input:
4
100 80
90 50
120 60
140 90
Sample Output:2
1 #include <cstdio>
2
3 int main() 4 { 5 //freopen("D:\\temp\\test\\tmp.txt", "r", stdin);
6
7 int n, a, b; 8 int sum = 0, maxsum = 0; 9 scanf("%d", &n); 10 for(int i=0; i<n; i++) { 11 scanf("%d %d", &a, &b); 12 if(a>=90 && a<=140 && b>=60 && b<=90) 13 sum++; 14 else
15 sum = 0; 16 if(sum > maxsum) 17 maxsum = sum; 18 } 19
20 printf("%d\n", maxsum); 21
22 return 0; 23 }
3.數字反轉
Description:
給定一個整數,請將該數各個位上數字反轉得到一個新數。新數也應滿足整數的常見形式,即除非給定的原數為零,否則反轉后得到的新數的最高位數字不應為零(參見樣例2)。
Input:輸入共 1 行,一個整數N。-1,000,000,000 ≤ N≤ 1,000,000,000。
Output:輸出共 1 行,一個整數,表示反轉后的新數。
Sample Input:樣例 #1:123 樣例 #2:-380
Sample Output:樣例 #1:321 樣例 #2:-83
1 #include <cstdio>
2
3 int main() 4 { 5 //freopen("D:\\temp\\test\\tmp.txt", "r", stdin);
6
7 int n, r = 0; 8 scanf("%d", &n); 9
10 while(n) { 11 r = r*10+(n%10); 12 n /=10; 13 } 14
15 printf("%d\n", r); 16
17 return 0; 18 }
4.求特殊自然數
Description:一個十進制自然數,它的七進制與九進制表示都是三位數,且七進制與九進制的三位數碼表示順序正好相反。編程求此自然數,並輸出顯示。
Input:無。
Output:三行。第一行是此自然數的十進制表示;第二行是此自然數的七進制表示;第三行是此自然數的九進制表示。
Sample Input:無。
Sample Output:(不提供)
1 #include <cstdio>
2
3 int main() 4 { 5 //freopen("D:\\temp\\test\\tmp.txt", "r", stdin);
6
7 printf("248\n503\n305\n"); 8
9 return 0; 10 }
5.雇佣兵
Description:
雇佣兵的體力最大值為M,初始體力值為0、戰斗力為N、擁有X個能量元素。
當雇佣兵的體力值恰好為M時,才可以參加一個為期M天的戰斗期,戰斗期結束體力值將為0。在同一個戰斗期內,雇佣兵每連續戰斗n天,戰斗力就會上升1點,n為當前戰斗期開始時的戰斗力。
一個戰斗期結束后,雇佣兵需要用若干個能量元素使其體力恢復到最大值M,從而參加下一個戰斗期。每個能量元素恢復的體力值不超過當前的戰斗力。每個能量元素只能使用一次。
請問:雇佣兵的戰斗力最大可以到達多少。
Input:一行包括三個整數M、N、X,相鄰兩個整數之間用單個空格隔開。M、N、X均為不超過10000的正整數。
Output:輸出一個整數,為雇佣兵的最大戰斗力。
Sample Input:5 2 10
Sample Output:6
1 #include <cstdio>
2
3 int main() 4 { 5 //freopen("D:\\temp\\test\\tmp.txt", "r", stdin);
6
7 int m, n, x; 8 scanf("%d %d %d", &m, &n, &x); 9
10 while(x > 0) { 11 int t = m/n; 12 if(m % n) 13 t++; 14 if(x < t) 15 break; 16 x -= t; 17 t = m/n; 18 n += t; 19 } 20
21 printf("%d\n", n); 22
23 return 0; 24 }
6.數字統計
Description:
請統計某個給定范圍[L, R]的所有整數中,數字2出現的次數。
比如給定范圍[2, 22],數字2在數2中出現了1次,在數12中出現1次,在數20中出現1次,在數21中出現1次,在數22中出現2次,所以數字2在該范圍內一共出現了6次。
Input:輸入共 1 行,為兩個正整數 L 和 R,之間用一個空格隔開。
Output:輸出共 1 行,表示數字 2 出現的次數。
Sample Input:樣例 #1:2 22 樣例 #2:2 100
Sample Output:樣例 #1:6 樣例 #2:20
1 #include <cstdio>
2
3 int main() 4 { 5 //freopen("D:\\temp\\test\\tmp.txt", "r", stdin);
6
7 int L, R; 8 int counter = 0; 9 scanf("%d %d", &L, &R); 10
11 for(int i=L; i<=R; i++) { 12 int j = i; 13 while(j) { 14 if(j%10 == 2) 15 counter++; 16 j /= 10; 17 } 18 } 19
20 printf("%d\n", counter); 21
22 return 0; 23 }