C/C++中的格式化IO
C/C++中的格式化IO操作(输入、输出)使用非常灵活,但C/C++语言标准中复杂的关于格式化IO的定义也很让人头疼。接下来,将系统地讨论C/C++定义的格式化字符串,以及在使用格式化输出时容易出现错误的地方。
格式化字符串的定义
格式化参数以一个字符串的形式定义了输入/输出的格式,例如类型、宽度、进制,等等,标准格式化字符串的定义:
%[flags][width][.precision][length]specifier
C/C++中的格式化IO操作(输入、输出)使用非常灵活,但C/C++语言标准中复杂的关于格式化IO的定义也很让人头疼。接下来,将系统地讨论C/C++定义的格式化字符串,以及在使用格式化输出时容易出现错误的地方。
格式化参数以一个字符串的形式定义了输入/输出的格式,例如类型、宽度、进制,等等,标准格式化字符串的定义:
%[flags][width][.precision][length]specifier
Scala初学笔记。
学习Scala的语法,还是从Hello World开始吧:
object HelloWorld {
def main(args: Array[String]) {
print("Hello World, Scala!")
}
}
Mathematica具有强大的数值计算系统,可以用来进行求解方程的根、对函数求最值等数值计算操作。与求根和求最值的相关操作如下:
在Java里,对象的初始化工作主要由构造函数完成,除此之外,静态初始化和实例初始化会完成另外一部分初始化工作。
类的构造函数承担类的实例化工作,Java中,每次使用new来创建一个新的对象时,都会调用对象的对应参数类型的构造函数。
Java中,构造函数的定义如下:
A constructor is used in the creation of an object that is an instance of a class.
Java继承机制是其Object-Oriented特性之一,使用继承extends时有很多需要注意的容易出错的小细节。例如,构造函数的调用顺序和规则、
首先从构造函数说起。
对于一个类,如果没有显式定义构造函数,那么便有一个无参的默认构造函数。但是,一定自己定义了构造函数(无论有没有参数),就都只能使用自己定义的构造函数。
继承时,如果子类没有显式定义构造函数,那么便会去寻找与调用的参数匹配的父类的构造函数。一旦子类定义了一个构造函数,无论参数类型,new构造子类对象时都不会直接匹配父类的同类型参数构造函数。如果不存在调用参数类型的构造函数,编译时会出现错误。需要注意的是,就算子类中没有定义构造函数,子类也没有默认的无参构造函数。
Haskell拥有惰性求值和一切皆函数的设计,在Haskell中,函数仅仅负责根据提供的参数返回特定的结果,并且,函数的结果不受外部环境的影响,仅仅与参数有关。但IO却拥有副作用,IO环境的变化使得函数的运行状态不可预测,这对程序的流程造成了严重的潜在影响。在Haskell中,使用了一套Monadic I/O的模型来弱化和解除程序对IO操作的依赖,其基本思想是控制构造具有IO操作的程序和限制IO运算对函数的影响。
以求最大值的函数max'为例,
max' :: (Ord a) => a->a -> a
max' x y
| x >= y = x
| x < y = y
调用该函数时可以这样做:
max' 1 2
也可以这样做:
(max' 1) 2
原因是这个函数的定义也可以看成是
对于流 f,若残留网络Gf不存在增广路,则 f 为流网络 G 的最大流。
定义流网络G的切割(cut),为流网络的点集V的一个划分[S, T],且源点source在S中,汇点sink在T中。从S到T的边称为割边。切割的流量即从S到T的边的流量之和。
在网络 G 中 [S, T ] 为最小的切割,f 为最大流,则有 | S | = | f |。
关于最大公约数的求解,主要有欧几里得算法和Stein算法两种方法。
欧几里得算法的原理为:
若
$$ a \equiv r(mod\ b) $$
则
$$ gcd(a,b) = gcd(b,r) $$
算法执行过程为辗转相除法。
算法实现也很简单:
树状数组(Binary Index Tree, BIT),是一个查询和修改复杂度都为O(lg(n))的数据结构。
对于序列a,我们设一个数组C定义C[i] = a[i – 2^k + 1] + … + a[i](i从1开始),k为i在二进制下末尾0的个数。 k的计算可以这样:
2^k = x and (x xor (x-1))
树状数组的结构如下图所示:

在实现时,可以定义宏