17、有這樣乙個函式,對於任意整數n,都能返回寫出0到n之間出現「1」的個數。例如,f(13)=6。請注意f(1)=1,那麼下乙個能實現f(n)=n的最大數字是什麼?
以下為驗證**:
option explicit
private sub command1_click()
dim i as long
dim s as double
dim s2 as double
dim s1 as double
dim s3 as double
s = 0
s1 = 1
s2 = 1
s3 = 1
for i = 1 to 20
s = s + s2 * 2 + s3 * 10 + 1
debug.print i, s2, s
s2 = s3 * 10 + s2 * 10
s3 = s3 * 10
next
end sub
程式輸出結果:
1 1 13
2 20 154
3 300 1755
4 4000 19756
5 50000 219757
6 600000 2419758
7 7000000 26419759
8 80000000 286419760
9 900000000 3086419761
10 10000000000 33086419762
11 110000000000 353086419763
12 1200000000000 3753086419764
13 13000000000000 39753086419765
14 140000000000000 419753086419766
15 1.5e+15 4.41975308641977e+15
16 1.6e+16 4.64197530864198e+16
17 1.7e+17 4.8641975308642e+17
18 1.8e+18 5.08641975308642e+18
19 1.9e+19 5.30864197530864e+19
20 2e+20 5.53086419753086e+20
可以看出那個數在1000000000-2222222221之間(10位數)
'1-26補充完整
private function f(byval n as long)
static num1(9) as long '定義 num1(1)=f(1)+..+f(9),num1(2)=f(1)+...+f(99)
dim i as long, j as long
dim s as long
dim s1 as long
dim s2 as long
dim s3 as long
dim m as long
dim mmod as long
'預處理
if num1(1) = 0 then
num1(0) = 0 '0位數所含1總數為0,這個可以作為公理吧
for i = 1 to 9 '2-9位數
num1(i) = num1(i - 1) * 10 + 10 ^ (i - 1)
next
end if
s = 0
m = n
for i = 1 to 10
mmod = (m mod 10)
if mmod = 0 then
elseif mmod = 1 then
' i-1位數總和 本位1 餘數
s = s + (m mod 10) * num1(i - 1) + 1 + ((n mod 10 ^ (i - 1)))
else
' i-1位數總和 餘數
s = s + (m mod 10) * num1(i - 1) + 10 ^ (i - 1)
end if
m = m / 10
if m = 0 then exit for
next i
f = s
end function
'用2分法查詢the next biggst
private function getnum() as long
dim i as long, j as long
dim high as double, low as double, mid as long
high = 2147483647
low = 1000000000
domid = (high + low) / 2
getnum = f(mid)
if getnum > mid then
high = mid
elseif getnum < mid then
low = mid
else
exit do
end if
loop
end function
用getnum可以得到那個數:1111111110
尋找最大數
描述 請在整數 n 中刪除m個數字,使得餘下的數字按原次序組成的新數最大,比如當n 92081346718538,m 10時,則新的最大數是9888 輸入 第一行輸入乙個正整數t,表示有t組測試資料 每組測試資料佔一行,每行有兩個數n,m n可能是乙個很大的整數,但其位數不超過100位,並且保證資料...
尋找最大數
時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 請在整數 n 中刪除m個數字,使得餘下的數字按原次序組成的新數最大,比如當n 92081346718538,m 10時,則新的最大數是9888 輸入 第一行輸入乙個正整數t,表示有t組測試資料 每組測試資料佔一行,每行有兩個數n...
尋找最大數
尋找最大數 三 時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述給出乙個整數n,每次可以移動2個相鄰數字上的數字,最多移動k次,得到乙個新的整數。求這個新的整數的最大值是多少。輸入多組測試資料。每組測試資料佔一行,每行有兩個數n和k 1 n 10 18 0 k 100 輸出每組...