《算法競賽入門經典》第1章 程序設計入門


提示1-1:整數值用%d輸出,實數用%lf輸出。

提示1-2:整數/整數=整數,浮點數/浮點數=浮點數。

提示1-3:scanf中的占位符和變量的數據類型應一一對應,且每個變量前需要加&(取地址)符號。

提示1-4:在算法競賽中,輸入前不要打印提示信息。輸出完畢后應立即終止程序,不要等待用戶按鍵,因為輸入輸出過程都是自動的,沒有人工干預。

提示1-5:在算法競賽中不要使用頭文件conio.h,包括getch()、clrscr()等函數。

提示1-6:在算法競賽中,每行輸出均應以回車符結束,包括最后一行。除非特別說明,每行的行首不應有空格,但行末通常可以有多余空格。另外,輸出的每兩個數或者字符串之間應以單個空格隔開。

提示1-7:盡量用const關鍵字聲明常數。

1 const double pi = 4.0 * atan(1.0);

這里聲明了一個叫pi的符號,但是const關鍵字表明它的值是不可以被改變的——pi是一個真正的數學常數。有的讀者可能會用math.h中定義的常量M_PI,但其實這個常數不是ANSI C標准的,不信的話可以用"gcc -ansi"編譯試試。

提示1-8:賦值是個動作,先計算右邊的值,在賦給左邊的變量,覆蓋它原來的值。

提示1-9:printf的格式字符串中可以包含其他可打印字符,打印時原樣輸出。

 

例題1-2 三位數反轉

輸入一個三位數,分離出它的百位、十位和各位,反轉后輸出。

樣例輸入:127

樣例輸出:721

1 #include <stdio.h>
2 
3 int main()
4 {
5     int n;
6     scanf("%d", &n);
7     printf("%d%d%d\n", n%10, n/10%10, n/100);
8     return 0;
9 }

運行結果如下:

說明:運算符*、/、%的優先級相同(優先級4),為左結合性,即從左往右運算。

上面的程序輸出027,但要改成輸出27似乎會比較麻煩——我們必須判斷n&10是不是0。一個解決方法是把結果儲存到變量m當中,這樣,直接用%d格式輸出m,將輸出27。如果要輸出027也很容易,把輸出格式變為%03d即可。

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int n, m;
 6 
 7     scanf("%d", &n);
 8     m = (n % 10) * 100 + (n / 10 % 10) * 10 + n / 100;
 9     printf("%03d\n", m);
10     return 0;
11 }

運行結果如下:

提示1-10:算法競賽的題目應當是嚴密的,各種情況下的輸入均應有嚴格規定。如果在比賽中發現題目有漏洞,應向相關人員詢問,而盡量不要自己隨意假定。

 

例題1-3 交換變量

輸入兩個整數a和b,交換二者的值,然后輸出。

樣例輸入:824 16

樣例輸出:16 824

 1 /* 三變量法 */
 2 #include <stdio.h>
 3 
 4 int main()
 5 {
 6     int a, b, t;
 7 
 8     scanf("%d%d", &a, &b);
 9     t = a;
10     a = b;
11     b = t;
12     printf("%d %d\n", a, b);
13 
14     return 0;
15 }

也可以不使用中間變量

 1 /* 兩變量法 */
 2 #include <stdio.h>
 3 
 4 int main()
 5 {
 6     int a, b, t;
 7 
 8     scanf("%d%d", &a, &b);
 9     a = a + b;
10     b = a - b;
11     a = a - b;
12     printf("%d %d\n", a, b);
13 
14     return 0;
15 }

最合適的程序莫過於

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int a, b, t;
 6 
 7     scanf("%d%d", &a, &b);
 8     printf("%d %d\n", b, a);
 9 
10     return 0;
11 }

換句話說,我們的目標是解決問題,而不是為了寫程序而寫程序,同時應保持簡單(Keep It Simple and Stupid,KISS),而不是自己創造條件去展示編程技巧。

提示1-13:算法競賽是在比誰能更好地解決問題,而不是在比誰寫的程序看上去更高級。

 

例題1-4 雞兔同籠

已知雞和兔的總數量為n,總腿數為m。輸入n和m,依次輸出雞的數目和兔的數目。如果無解,則輸出“No answer”。

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int a, b, n, m;
 6 
 7     scanf("%d%d", &n, &m);
 8     a = (4*n -m) / 2;
 9     b = n - a;
10     if (m % 2 == 1 || a < 0 || b < 0)
11     {
12         printf("No answer\n");
13     }
14     else
15     {
16         printf("%d %d\n", a, b);
17     }
18 
19     return 0;
20 }

運行結果如下:

 

 

 

 


免責聲明!

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



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