原題在「兩道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...