问题1:3的方幂及不相等的3的方幂的和排列成递增序列{1,3,4,9,10,12,13…},写出数列第300项。
这里说明一下,全文都不考虑数的长度会不会超过我们定义类型的最大值。
分析:首先想到的是再继续列出后面的一些项,找找规律。
1 →第一行有1个数
3,4 →第二行有2个数
9,10,12,13 →第三行有4个数
27,28,30,34,36,37,39,40 →第四行有8个数
…… →第k行有2k个数
看见右边的数,我们应该很能够很敏感的看出规律来。比如这个数列的第12项37就可以拆成这样的形式:37=1x33+1x32+0x31+0x30,然后我们把3的方幂前面的系数提取出来,就能得到一串数字:1100,这也就是12的二进制数。
然后我们推广到一般的情况,对于上述数组中的第n项an,我们也可以拆成
an=b0x30+ b1x31+ b2x32+ b3x33+……+ bmx3m
而bn等于0或1,然后按照bm…b2b1的顺序写出来,就是一个二进制数。因此,我们的问题就可以解决的。将300写成二进制数就是1 0010 1100,所以a300=1x38+1x35+1x33+1x32=6848。
剩下的问题无非是二进制的转换(O(logN))和求幂(O(logN))的两个算法。
其实得到这样的答案并不难,有同学提示我说这不就是三进制么,然后我就把3进制的数挨个列出来,也发现了规律,于是就有了后面的问题3。
下面列出1-20与之对应的3进制数
1 001 1
2 002
3 010 2
4 011 3
5 012
6 020
7 021
8 022
9 100 4
10 101 5
11 102
12 110 6
13 111 7
14 112
15 120
16 121
17 122
18 200
19 201
20 202
其中红色的数字就是我们上面的数组an的前几项,第三列就是数字在数组中的第几项,发现他们对应的三进制编码里面都没有2,所以才恍然大悟,是因为在组成和的时候,3的方幂都最多只用了一次,因此3进制编码里面才不会出现2(果然不同的同学思路和观察角度是不一样的)。
问题2:我们再把这个问题扩展一下,给定一个正整数k,把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,写出数列第n项。
分析:有了上一个问题的分析,这个问题解决起来就简单多了。我们先将n转换成2进制数bm…b2b1,然后计算an=b0xk0+ b1xk1+ b2xk2+ b3xk3+……+ bmxkm就可以得到第n项的值了。
问题3:再把这个问题扩展一下,用5的方幂{1,5,25,125,625…}序列中的项组成的和,其中每项至多能用2次,这些和构成一个递增的序列{1,5,6,7,10,11,25,26,27,30,31,32…},写出数列第n项。
分析:当然,这个题你肯定能迅速想到将n转换成3进制,然后用每一位去乘以对应的5的方幂,在求和,就能得到第n项的值。
但是这里还是分析一下。在问题1中有分析到3进制的问题,所以我们不妨把1到20的数写成5进制来找一找规律:
1 001 1
2 002 2
3 003
4 004
5 010 3
6 011 4
7 012 5
8 013
9 014
10 020 6
11 021 7
12 022 8
13 023
14 024
15 030
16 031
17 032
18 033
19 034
20 040
红色加粗的数字就是an的前几项,很显然,他们对应5进制数中,只含有0,1,2,因为每个方幂都有可能被用到0次、1次和2次,仍然有an=b0xk0+ b1xk1+ b2xk2+ b3xk3+……+ bmxkm,只不过这里的k=5,并且bn可以取到0、1、2三个数,所以此时bm…b2b1是一个三进制数。我们把n转换成3进制再去计算,就是顺理成章的了。
问题4:你应该猜得出来接下来这个扩展的问题是什么了,就是把问题3中的5换成k,并且其中每项最多能用到j次(j,求第n项。
看过前面几个问题的分析,这个问题的解决就不在话下了。
问题5:现在给你一个序列{1,3,7,15,31,63,127,255…},该序列每一项都是前一项的两倍加1,同样用这个序列中的项组成和,且每项最多用一次,结果按照升序排列,求第100项的值。
解法也很显然,我们把100写成2进制数就是110 0100,原序列的通项公式是2n-1,所以第100项就是1x127+1x63+1x7=197。
只要序列满足前n-1项的和小于第n项,我们就能按照前面的思想,就算给定的序列是没有通项公式的,我们都能用这个方法算出新得到的序列的第n项。