算法题——第1000000个数是多少?

  原题在“两道TB面试题”文章中。今日在本文中,就个人的理解再阐述一遍。

  题目1:有一个数列,它由3个数列复合而成,并升序排列。三个数列分别是2的n次,3的n次,5的n次,0≤n<∞。给出前几项:1,2,3,4,5,8,9,16,25,27………………即20(30, 50) , 21, 31, 22, 51, 23, 32, 42, 52, 33。问你如何快速得到第1000000个数的值。
  问题2:有一个数列,它由3个数列复合而成,并升序排列。三个数列分别是2的n次,3的n次,5的n次,1≤n<∞。给出前几项:2,3,4,5,8,9,16,25,27………………即21, 31, 22, 51, 23, 32, 42, 52, 33。问你如何快速得到第Index个数的值。

  可以看出,问题2和问题1是同一个问题。只不过,问题2把问题1的第一个数去除而已。我们先从问题2解决。

  不失一般性,假设在前Index个数中,2的n次的有X个,3的n次有Y个,5的n次有Z个。则X+Y+Z=Index
  假设第Index个数是2X。(也可能是3Y和5Z,后面再分类讨论)

  可知        3Y<2X

  两边取对数     lg3Y<lg2X
            Ylg3<Xlg2

            Y<Xlg2/lg3

            Y<Xlog32

  因为Y是整数    Y=[Xlog32]

  同理可知       Z=[Xlog52]

  则         Index=X+Y+Z=X+[Xlog32]+[Xlog52]<X+Xlog32+Xlog52

  又因为      Xlog32<Y+1、Xlog52<Z+1

  所以        Index<X+Xlog32+Xlog52<Index+2

  所以        Index/(1+log32+log52)<X<(Index+2)/(1+log32+log52)

  

  由上式可知,如果第Index个数是2X。则X满足Index/(1+log32+log52)<X<(Index+2)/(1+log32+log52)

  再根据X的值计算Y和Z的值。若X+Y+Z=Index。说明第Index个数是2X。若不满足说明第Index个数不是2X

 

  同理,可以假设第Index个数是3Y或5Z。推理就不写了。

 

  把代码贴于下方,用的是VB2005

  Public Class clsFind
    Private Shared LOG23 As Double = Math.Log(3, 2)
    Private Shared LOG25 As Double = Math.Log(5, 2)
    Private Shared LOG32 As Double = Math.Log(2, 3)
    Private Shared LOG35 As Double = Math.Log(5, 3)
    Private Shared LOG52 As Double = Math.Log(2, 5)
    Private Shared LOG53 As Double = Math.Log(3, 5)

    Private Shared S2 As Double = 1 + LOG32 + LOG52
    Private Shared S3 As Double = 1 + LOG23 + LOG53
    Private Shared S5 As Double = 1 + LOG25 + LOG35

    Public Shared Function FindNumber(ByVal Index As Integer) As Long
      Dim X1 As Integer, X2 As Integer

      Dim i As Integer

      'Index -= 1

      

      '假设第Index个数是2^X

      X1 = -Int(-Index / S2)
      X2 = Int((Index + 2) / S2)

      For i = X1 To X2
        If i + Int(i * LOG32) + Int(i * LOG52) = Index Then Return i * 10 + 2
      Next

              

      '假设第Index个数是3^Y

 

      X1 = -Int(-Index / S3)
      X2 = Int((Index + 2) / S3)
      For i = X1 To X2
        If i + Int(i * LOG23) + Int(i * LOG53) = Index Then Return i * 10 + 3
      Next

 

      '假设第Index个数是5^Z

      X1 = -Int(-Index / S5)
      X2 = Int((Index + 2) / S5)
      For i = X1 To X2
        If i + Int(i * LOG25) + Int(i * LOG35) = Index Then Return i * 10 + 5
      Next
       

      Return -1
    End Function
  End Class

  注意: 该函数返回的值还要再处理一下。

  例如:clsFind.FindNumber(1000)得到的值是2095。表示第1000个数是5209

  

  这个函数是解决问题2的。而问题2就和问题1相差一个数。故如果是问题1,将Index-=1这句话取消注释就可以了。

  问题1的第1000000个数是3306038

时间: 2024-10-14 14:39:46

算法题——第1000000个数是多少?的相关文章

百度知道-【java算法题】凑凑凑凑凑凑字数

问题描述 [java算法题]凑凑凑凑凑凑字数 题目:标题:猜字母???把abcd...s共19个字母组成的序列重复拼接106次,得到长度为2014的串.???接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母.??得到的新串再进行删除奇数位置字母的动作.如此下去,最后只剩下一个字母,请写出该字母./-----------------------------------从百度知道查看但是不懂 1024 和他的思维求大神解惑 /----------------------

c语言-[C语言]求一个算法,输入N个数,输出所有其中任意M个数相加等于定值S的结果

问题描述 [C语言]求一个算法,输入N个数,输出所有其中任意M个数相加等于定值S的结果 如题,比如输入1,,2,10,5,7,8,9,11,输出其中任意几个数相加等于12的结果(不重复), 不自身相加. 1+2+9=12 10+2=12 7+5=12 解决方案 这题如果不考虑优化问题--轮询吧--总共有2的n次方种组合-学过排列组合的都知道

求助一道二维数组交换特定元素位置的算法题,谢谢大家!

问题描述 求助一道二维数组交换特定元素位置的算法题,谢谢大家! 刚试验了一下出了新问题- - 比如,一开始是左边的数组,我想"把2个0去掉,然后0上面的2就掉下来了",形成右边的新数组 然后我用了循环遍历,比如只看第二列,我的做法是"从下往上找,遇到0,就和0上面的数字交换",结果成了下面这个样子了- - 我有个改进想法是"还是从下往上找,遇到0之后判断上面的是不是0,如果是0,再继续向上再找,直到不是0,然后把这个数赋值给一开始那个0的位置",

经典算法题每日演练——第十七题 Dijkstra算法

原文:经典算法题每日演练--第十七题 Dijkstra算法         或许在生活中,经常会碰到针对某一个问题,在众多的限制条件下,如何去寻找一个最优解?可能大家想到了很多诸如"线性规划","动态规划" 这些经典策略,当然有的问题我们可以用贪心来寻求整体最优解,在图论中一个典型的贪心法求最优解的例子就莫过于"最短路径"的问题.   一:概序    从下图中我要寻找V0到V3的最短路径,你会发现通往他们的两点路径有很多:V0->V4-&g

基础算法题,求思路和代码

问题描述 基础算法题,求思路和代码 问题 E: L1-6. 连续因子 时间限制: 1 Sec 内存限制: 128 MB 题目描述 一个正整数N的因子中可能存在若干连续的数字.例如630可以分解为3*5*6*7,其中5.6.7就是3个连续的数字.给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列. 输入 输入在一行中给出一个正整数N(1<N<231). 输出 首先在第1行输出最长连续因子的个数:然后在第2行中按"因子1*因子2*--*因子k"的格式

面试题-今天朋友去面试看到一个算法题,求解

问题描述 今天朋友去面试看到一个算法题,求解 如题,完全没思路啊orz求指教,按照题目推测似乎是一个两个数之间距离为自身进行排序的算法,但是具体实现完全没思路,实在不行求个算法名也好啊orz 解决方案 public class Test { int n = 4; int[] arr = new int[2*n]; public void init(){//初始化 for(int i = 0; i<2*n; i++){ arr[i] = -1; } } public void sort(int g

想问朋友面试中遇到的一个算法题:

问题描述 想问朋友面试中遇到的一个算法题: Write a program in Java to assess a given string whether it complies with following patterns. Return true if a given string complies with these patterns else false. N = N1 + N2 N>= N1 >= N2 where N is the Nth element in the str

经典算法题每日演练——第二十二题 奇偶排序

原文:经典算法题每日演练--第二十二题 奇偶排序   这个专题因为各种原因好久没有继续下去了,MM吧...你懂的,嘿嘿,不过还得继续写下去,好长时间不写,有些东西有点生疏了, 这篇就从简单一点的一个"奇偶排序"说起吧,不过这个排序还是蛮有意思的,严格来说复杂度是O(N2),不过在多核的情况下,可以做到 N2 /(m/2)的效率,这里的m就是待排序的个数,当m=100,复杂度为N2 /50,还行把,比冒泡要好点,因为重点是解决问题的奇思妙想.     下面我们看看这个算法是怎么描述的,既

浅谈js中字符和数组一些基本算法题_javascript技巧

最近在刷 fcc的题,跟升级打怪一样,一关一关的过,还挺吸引我的.今天抽时间把 Basic Algorithm Scritping  这部分题做了,根据一些提示,还是比较简单的.有些题的处理方式 方法,我想值得借鉴.比如在项目中有时候要处理一个字符,如果想不到一些相关的方法,还挺费事的,所以,在此记录下来,如果以后遇到一些字符或者数组处理,可以来翻翻这篇文章,希望以此得到一些提示而不是去翻文档. 看到此博文的博友,有更好更简单的代码或者好的想法,请留言交流(我一直觉得只有学习别人的优秀代码才能进