《算法竞赛入门经典》第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%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
", 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
", 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
", 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
", 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
");
13     }
14     else
15     {
16         printf("%d %d
", a, b);
17     }
18 
19     return 0;
20 }

运行结果如下:

原文地址:https://www.cnblogs.com/rezone/p/3201659.html