算法竞赛入门经典(第2版)第1部分 语言篇 第一章 程序设计入门

1.3 顺序结构设计
变量交换
三变量法:
#include <stdio.h>
int main() {
int a, b, t;
scanf("%d %d", &a, &b);
t = a;
a = b;
b = t;
printf("%d %d\n", a, b);
return 0;
}
不借助其他变量的变量交换:
#include <stdio.h>
int main() {
int a, b;
scanf("%d %d", &a, &b);
a = a + b;
b = a - b;
a = a - b;
printf("%d %d\n", a, b);
return 0;
}
利用异或运算的变量交换:
#include <stdio.h>
int main() {
int a, b;
scanf("%d %d", &a, &b);
a ^= b ^= a ^= b;
printf("%d %d\n", a, b);
return 0;
}
因异或运算为位运算,所以在效率上最高。异或运算法同不借助其他变量的变量交换一样,在实际应用上很少,因为其适用范围很窄:只有在定义了加减法的数据类型才能采用此法。
对于只解决变量交换而言,再输出上直接交换最合适:
#include <stdio.h>
int main() {
int a, b;
scanf("%d %d", &a, &b);
printf("%d %d\n", b, a);
return 0;
}
多数算法竞赛采用黑盒测试,即只考察程序解决能力,而不关心采用了什么方法。
换句话说,我们的目标是解决问题,而不是为了写程序而写程序,同时应保持简单(Keep It Simple and Stupid, KISS),而不是自己创造条件去展示编程技巧。
1.4 分支结构程序设计
如果a为真,则无论b的值如何,a || b均为真。换句话说,一旦发现a为真,就不必计算b的值。C语言正是采取了这样的策略,称为短路(short-circuit)。用短路的方法计算逻辑表达式的优点不只是速度更快,之后会通过几个例子予以证实。
C语言中的逻辑运算符都是短路运算符。一旦能够确定整个表达式的值,就不再继续计算。
三整数排序
#include <stdio.h>
int main() {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
if (a <= b && b<= c) printf("%d %d %d\n", a, b, c);
else if (a <= c && c <= b) printf("%d %d %d\n", a, c, b);
else if (b <= a && a <= c) printf("%d %d %d\n", b, a, c);
else if (b <= c && c <= a) printf("%d %d %d\n", b, c, a);
else if (c <= a && a <= b) printf("%d %d %d\n", c, a, b);
else if (c <= b && b <= a) printf("%d %d %d\n", c, b, a);
return 0;
}
最后一条语句还可以简化成单独的else,因为到最后已经没有其余的情况了。
如果有多个并列、情况不交叉的条件需要一一处理,可以用else if语句。/这里是书中原文提示1-19,这不该是情况交叉的条件才需要一一处理吗/
1.5 注解与习题
数据类型与输入格式
数据类型实验
实验A1:表达式11111*11111的值是多少?把5给1改成6给1呢?9个1呢?

当6个1时编译器会警告溢出

运行结果

当9个1时编译器同样也会警告,运行结果

实验A2:把实验A1中的所有数换成浮点数,结果如何?
当换成浮点数后编译器不再警告,并且成功运行

实验A3:表达式sqrt(-10)的值是多少?尝试用各种方式输出。在计算的过程中系统会报错吗?
在没有用头文件math.h的情况下编译会提示和警告

用%f输出运行结果

用%d输出运行结果

用%e输出运行结果

实验A4:表达式1.0/0.0、0.0/0.0的值是多少?尝试用各种方式输出。在计算的过程中系统会报错吗?
用%f输出运行结果

用%d输出运行结果

实验A5:表达式1/0的值是多少?在计算的过程中系统会报错吗?
编译器会警告,并且运行无输出

输入格式实验
#include <stdio.h>
int main() {
int a, b;
scanf("%d %d", &a, &b);
printf("%d %d\n", a, b);
return 0;
}
实验B1:在同一行输入12和2,并以空格分隔,是否得到预期的结果?
得到预期结果
实验B2:在不同两行中输入12和2,是否得到预期的结果?
得到预期结果
实验B3:在实验B1和B2中,在12和2的前面和后面加入大量空格或水平制表符(TAB),甚至插入一些空行。
得到预期结果
实验B4,把2换成字符是,重复B1~B3.
在不改变变量类型和输入输出类型的情况下

在就变量b类型和输入输出类型改为字符类型后得到预期结果

输出技巧
如果要输出斜线“\"和字符n,可以“printf("\\n");”,编译器会把双斜线“\\”理解成单个字符“\”。这是一个很有意思的设计,可以通过转义字符输出特殊字符包括自己。
1.5.3 习题

posted @ 2020-10-31 22:37  Hziqng  阅读(74)  评论(0)    收藏  举报