提示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 }
運行結果如下: