第4周


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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM