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

问题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项。

转载于:https://my.oschina.net/u/1247611/blog/162746

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值