zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Android -- 经验分享
    Android -- 获取汉字的首字母
    Android -- PowerManager和PowerManager.WakeLock
    内存堆和栈的区别
    Java BigDecimal大数字操作
    myqsl for C# 驱动包下载地址-官网
    ASP.NET 查询客户端请求IP地址
    Chapter 6 — Improving ASP.NET Performance
    WebSocket 支持的浏览器
    Local System、Local Service與Network Service
  • 原文地址:https://www.cnblogs.com/morgan-yuan/p/3331108.html
Copyright © 2011-2022 走看看