網易2017程式設計題之前n個數的最大奇約數之和

2021-08-08 00:01:32 字數 1552 閱讀 8775

小易是乙個數論愛好者,並且對於乙個數的奇數約數十分感興趣。一天小易遇到這樣乙個問題: 定義函式f(x)為x最大的奇數約數,x為正整數。 例如:f(44) = 11.

現在給出乙個n,需要求出 f(1) + f(2) + f(3)…….f(n)

例如: n = 7

f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3 + 7 = 21

小易計算這個問題遇到了困難,需要你來設計乙個演算法幫助他。

我的想法是樣的,前n個數中,我們可以把任意乙個偶數表示成乙個奇數和乙個偶數的乘積,例如8=

23∗1

,10=2

∗5,18

=2∗9

,等等。

再擴充套件一步,前n個數中,任意數都可以表示成:x=

2k∗j

,k=0

,1,2

,...

,m這裡的x是任意小於等於n的數,j是某乙個奇數,那麼我們現在看一下m的大小(懶得打公式,也不是很會…):

即m為[lo

g2n]

是向下取整符號

這樣我們就可以計算每個k對應有多少個j符合要求的,假設為分別為k1

,k2,

...,

km個,再用奇數的前n項和公式,k2

i,i=

0,1,

2,..

.,m

,求和,累計相加即可。下面給出一些例子:

這裡只剩下計算每個ki

對應的奇數的個數j了。

從上面例子可以看出j的值為([

n/2i

]+1∗

y)/2

其中[ ]表示向下取整,y=0,當且僅當 [n/2^i]為偶數,y=1當且僅當[n/2^i]為奇數。下面給出python程式

def

get_j_sum

(n):

import math

defget_k_j_sum

(ki):

return ki**2

defget_j_num

(k):

if k%2!=0:

return (k+1)/2

else:

return k/2

m = math.floor(math.log(n, 2))

s=0for i in range(int(m+1)):

k=math.floor(float(n)/(2**i))

ki=get_j_num(k)

s+=get_k_j_sum(ki)

return int(s)

然而,牛客上我的正確率只有60%,不知道哪位大神幫我找出錯誤呢???這個在計算100000000的時候與標準答案差了150,望大神指點指

網易2017秋招程式設計題

小易有乙個圓心在座標原點的圓,小易知道圓的半徑的平方。小易認為在圓上的點而且橫縱座標都是整數的點是優雅的,小易現在想尋找乙個演算法計算出優雅的點的個數,請你來幫幫他。例如 半徑的平方如果為25 優雅的點就有 3,4 4,3 0,5 5,0 一共12個點。輸入描述 輸入為乙個整數,即為圓半徑的平方,範...

網易2017秋招程式設計題

第一題 如果乙個數字序列逆置之後跟原序列是一樣的就稱這樣的數字串行為回文序列。例如 是回文序列,不是回文序列。現在給出乙個數字序列,允許使用一種轉換操作 選擇任意兩個相鄰的數,然後從序列移除這兩個數,並用這兩個數字的和插入到這兩個數之前的位置 只插入乙個和 現在對於所給序列要求出最少需要多少次操作可...

網易有道2017內推程式設計題

1.洗牌 洗牌在生活中十分常見,現在需要寫乙個程式模擬洗牌的過程。現在需要洗2n張牌,從上到下依次是第1張,第2張,第3張一直到第2n張。首先,我們把這2n張牌分成兩堆,左手拿著第1張到第n張 上半堆 右手拿著第n 1張到第2n張 下半堆 接著就開始洗牌的過程,先放下右手的最後一張牌,再放下左手的最...