3的方幂及不相等的3的方幂的和排列成递增序列{1,3,4,9,10,12,13…},写出数列第300项

[转] http://blog.sina.com.cn/s/blog_6d932f2a0101jgyz.html

问题13的方幂及不相等的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个数

看见右边的数,我们应该很能够很敏感的看出规律来。比如这个数列的第1237就可以拆成这样的形式:37=1x33+1x32+0x31+0x30,然后我们把3的方幂前面的系数提取出来,就能得到一串数字:1100,这也就是12的二进制数。

然后我们推广到一般的情况,对于上述数组中的第nan,我们也可以拆成

an=b0x30+ b1x31+ b2x32+ b3x33+……+ bmx3m

bn等于01,然后按照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进制的问题,所以我们不妨把120的数写成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可以取到012三个数,所以此时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项。

[转] http://blog.sina.com.cn/s/blog_6d932f2a0101jgyz.html

原文地址:https://www.cnblogs.com/morgan-yuan/p/3331108.html