《算法竞赛入门经典》第1章 程序设计入门

提示1-1:整数值用%d输出,香港服务器,实数用%lf输出。

提示1-2:整数/整数=整数,浮点数/浮点数=浮点数。

提示1-3:scanf中的占位符和变量的数据类型应一一对应,且每个变量前需要加&(取地址)符号。

提示1-4:在算法竞赛中,输入前不要打印提示信息。输出完毕后应立即终止程序,不要等待用户按键,因为输入输出过程都是自动的,没有人工干预。

提示1-5:在算法竞赛中不要使用头文件conio.h,包括getch()、clrscr()等函数。

提示1-6:在算法竞赛中,每行输出均应以回车符结束,包括最后一行。除非特别说明,每行的行首不应有空格,但行末通常可以有多余空格。另外,输出的每两个数或者字符串之间应以单个空格隔开。

提示1-7:尽量用const关键字声明常数。

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> main()4 {5int n;, &n);, n%10, n/10%10, n/100);;9 }

运行结果如下:

说明:运算符*、/、%的优先级相同(优先级4),为左结合性,即从左往右运算。

上面的程序输出027,但要改成输出27似乎会比较麻烦——我们必须判断n&10是不是0。一个解决方法是把结果储存到变量m当中,这样,直接用%d格式输出m,将输出27。如果要输出027也很容易,把输出格式变为%03d即可。

1 #include <stdio.h> main() 4 { 5int n, m;, &n); 8m = (n % 10) * 100 + (n / 10 % 10) * 10 + n / 100;, m);;11 }

运行结果如下:

提示1-10:算法竞赛的题目应当是严密的,各种情况下的输入均应有严格规定。如果在比赛中发现题目有漏洞,应向相关人员询问,而尽量不要自己随意假定。

例题1-3 交换变量

输入两个整数a和b,交换二者的值,然后输出。

样例输入:824 16

样例输出:16 824

#include <stdio.h> main() 5 { 6int a, b, t;, &a, &b); 9t = a;10a = b;11b = t;, a, b);;15 }

也可以不使用中间变量

#include <stdio.h> main() 5 { 6int a, b, t;, &a, &b); 9a = a + b;10b = a – b;11a = a – b;, a, b);;15 }

最合适的程序莫过于

1 #include <stdio.h> main() 4 { 5int a, b, t;, &a, &b);, b, a);;11 }

换句话说,我们的目标是解决问题,而不是为了写程序而写程序,同时应保持简单(Keep It Simple and Stupid,KISS),而不是自己创造条件去展示编程技巧。

提示1-13:算法竞赛是在比谁能更好地解决问题,而不是在比谁写的程序看上去更高级。

例题1-4 鸡兔同笼

已知鸡和兔的总数量为n,总腿数为m。输入n和m,依次输出鸡的数目和兔的数目。如果无解,则输出“No answer”。

1 #include <stdio.h> main() 4 { 5int a, b, n, m;, &n, &m); 8a = (4*n -m) / 2; 9b = n – a;10if (m % 2 == 1 || a < 0 || b < 0)11 {);13 } {, a, b);17 };20 }

运行结果如下:

只知道心痛得滴血,都只为你。

《算法竞赛入门经典》第1章 程序设计入门

相关文章:

你感兴趣的文章:

标签云: