演算法題 第1000000個數是多少?

2021-09-06 03:05:40 字數 2551 閱讀 1380

原題在「兩道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]32+xlog52

又因為      xlog3252所以        index32+xlog52所以        index/(1+log32+log52)32+log52)

由上式可知,如果第index個數是2x。則x滿足index/(1+log32+log52)32+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。

演算法題 第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,5...

資料結構演算法題 判斷乙個數字是否是回文數

題目大意 判斷乙個數字是否是回訪字數,不要使用額外的空間。解題思路 先逆序然後判斷是否相等 為了不使用額外的空間,參考了其它的解決,那些解法看起來在ispalindrome方法中沒有使用額外引數,但是卻使用了方法呼叫,這個比乙個整數消耗的空間更多 並沒有達到題目的要求,是假的實現,所以本題依然採用乙...

判斷乙個數是否是回文數

題目 定義回文數的概念如下 如果乙個非負數左右完全對應,則該數是回文數,如 121,22 如果乙個負數的絕對值左右完全對應,則該數是回文數,如 121,22 public static void main string args printrandm arr,3 1 5 4 system.out.p...