4 5 6 7 8 9 ?? 128 1 0 1 0 1 0 1 1 0 0 1 1 0 1 0 1 1 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 本题稍有些难度,观察m*n的0-1矩阵,可以看出m=2n,此矩阵其实就是所有7位的二进制数。每一列中有2n-1个1和个0,在一列里每个1都有2^(n-1)个0与它不同,同样每个0也有2^(n-1)个1与它不同,即每列的结果为22n-2*2=22n-1,n列的结果为n*22n-1,所以本题的结果为213*7.
此题也可以从递推的角度来求解:
f(n)=4n/(n-1)*f(n-1) (因为列增加1时行变为原来两倍,01的个数也对应为原来2倍)
f(1)=2
由此递推式子也可以得到通项公式:f(n)=n*22n-1。
再分析此题,发现就是从0开始由小到大每次增加1构造出所有n位二进制数,如果将低位写在右边更符合平常习惯,更易看出结果。 五、完成程序题 1.①ans.num[i+j-1]
②ans.num[i]:=ans.num[i] mod 10 ④ans.num[i] mod 2
③a.num[i]+b.num[i] ⑤inc(ans.len)
⑥a.len ⑧times(middle,middle),target ⑦ord(‘0’)或48 此题为简单高精度运算的大杂烩,加减乘除几乎全有。 乘法中要注意的是i位乘以j位的数据结果加到i+j-1位里,乘完以后再考虑进位; 加法是对应位相加,可以同步处理进位。 除法本题只是除以2,一位一位除2的时候,余数的情况要先处理。 另外还有一个比较两个以数组形式存储的大数据大小的子程序over,先从长度来考虑,谁长谁大,相等长度时从高位向低位依次比较,只要出现有大的情况就认为它大。 2.①inc(num) ②j:=i ④solve(j+1,right,deep+1) ③solve(left,j-1,deep+1) 基本算法是: 如果当前深度deep超过最大深度maxdeep,则maxdeep?deep且将叶子数sum记为1; 如要当前深度deep=maxdeep,则将sum数加1; 找到当前序列的最小值,并记录它的位置j,以它作为当前子树的根; 如果序列中位置j的前面还有数据(有左子树)则再以此方法处理左边的数据; 如果序列中位置j的后面还有数据(有右子树)则再以此方法处理右边的数据;