《算法竞赛入门经典》第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 }
运行结果如下: