1. 程式人生 > >網易2017年校招筆試題 最大的奇約數

網易2017年校招筆試題 最大的奇約數

題目:

定義函式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 + 7 = 21.

分析:

奇數的最大奇約數是自身, 偶數的最大奇約數是是除去所有偶因子之後的那個奇數。所以直觀的思路就是挨個遍歷一遍加起來。

程式碼:

 1 #include <iostream>
 2 using namespace
std; 3 int main() { 4 long long N; 5 cin >> N; 6 long long result = 0; 7 for (long long i = 1; i <= N; ++i) { 8 int temp = i; 9 while (temp % 2 == 0) { 10 temp /= 2; 11 } 12 result += temp; 13 } 14 cout << result << endl;
15 return 0; 16 }

然而, N的取值範圍時10^10,所以O(n)的演算法是超時的。

考慮優化,設sum(i) = f(1) + f(2) + ... + f(i);

求sum(i)的過程中,對於f(i), i 為奇數可以直接求,就是 i 本身。

問題就是求所有f(i), i為偶數的和。

因為要求的是最大奇約數,所以f(2k) = f(k),所以f(2) + f(4) + ... + f(2k) = f(1) + f(2) + ... + f(k);

所以

sum(i) =  sum (i / 2) + 1 + 3 + ... + i - 1  (i 為偶數)

          =  sum (i - 1) + i (i 為奇數)

時間複雜度O(logn),可以解決。

 1 #include<iostream>
 2 using namespace std;
 3 long long sum(long long n) {
 4     if (n == 1) {
 5         return 1;
 6     }
 7     if (n % 2 == 0) {
 8         return  sum(n / 2) + n * n / 4;
 9     }
10     else {
11         return sum(n - 1) + n; 
12     }
13 }
14 int main() {
15     long long N;
16     cin >> N;
17     cout << sum(N) << endl;
18 }

有朋友回覆可能擔心stackoverflow,當時寫的時候也覺得可能會遞迴層數太多,但是提交還是過了的。

還是可以寫成非遞迴的。

程式碼:

 1 #include<iostream>
 2 using namespace std;
 3 long long sum(long long n) {
 4     long long result = 0;
 5     while (n > 0) {
 6         if (n % 2 == 0) {
 7             result += n * n / 4;
 8             n /= 2;
 9         }
10         else {
11             result += n;
12             n--;
13         }
14     }
15     return result;
16 }
17 int main() {
18     long long N;
19     cin >> N;
20     cout << sum(N) << endl;
21 }

相關推薦

2017試題 約數

題目: 定義函式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

】2018試題

一丶魔法幣  小易準備去魔法王國採購魔法神器,購買魔法神器需要使用魔法幣,但是小易現在一枚魔法幣都沒有,但是小易有兩臺魔法機器可以通過投入x(x可以為0)個魔法幣產生更多的魔法幣。魔法機器1:如果投入x

2017

小易準備去魔法王國採購魔法神器,購買魔法神器需要使用魔法幣,但是小易現在一枚魔法幣都沒有,但是小易有兩臺魔法機器可以通過投入x(x可以為0)個魔法幣產生更多的魔法幣。魔法機器1:如果投入x個魔法幣,魔法機器會將其變為2x+1個魔法幣魔法機器2:如果投入x個魔法幣

貝殼19試題

題目描述 小智和小春兩個遊戲菜鳥要進行電競搏鬥,小智有X點HP,每次攻擊會使對方丟失A點生命值,每次攻擊完後需要冷卻C秒,小春有Y點HP,每次攻擊會使對方丟失B點生命值,每次攻擊完後需要冷卻D秒,玩家HP小於等於0時便死亡,若小智最終存活,則輸出XIAOZHI,

小米運維部14試題A的個人答案

15年準備實習生面試時答的題,僅供參考一、linux基礎1)linux系統中如何獲取pid為100的程序所監聽的tcp埠,請給出詳細命令?【答】方法一:1netstat -nlg | grep 1950   2[[email protected] pierre]#

美團點評2017試題

2017/8/31 19:00 - 21:20 輸入一串只有1和0的串,擷取子串能構成1010或010這樣的串(相鄰不重複),求構成這樣的串的最大長度 例子:輸入n 代表輸入串的長度

2017運維工程師試題(程式題)——山寨題解

第一題 題意:某人想買n個蘋果,水果攤只有6個一袋和8個一袋兩種售賣方式,問是否能按袋買進正好湊足n個,如果可以,輸出最少包數,不可以則輸出-1。 題解:跟藍橋杯初賽題目難度類似。排列問題,n規模很小,不超過100,深搜一下,每層遞迴儲存剩餘蘋果數目,先嚐試

猿圈19試題

1.查詢整數 題目描述: 給定一個非降序的整數陣列,陣列中包含重複數字(重複數字很多),給定任意整數二分查詢,返回陣列正確的位置,給出函式實現。 a.連續相同的數字,返回最後一個匹配的位置。 b.如果數字不存在返回-1。 輸入描述: 第一行給定陣列長度n,目標值

2018試題——web前端開發

週六同學參加網易校招筆試,她投的前端開發,我也順便看了兩眼,題目並不算很難。第二道程式設計還和京東校招筆試題一樣(雖然我沒做出來....)。 我只記得第一題... 然而當時並沒有幫我同學調出來.....但是剛才只用了十多分鐘就做完了...... 所以其實校招筆試題並不難 題

2017完美世界試題,從n層大樓往下扔m顆玻璃珠確定珠子破碎的臨界樓層

這道題可以搜尋google扔玻璃珠筆試題以及騰訊2017的校招筆試也有一道這樣的題,不同的是,以上的題中只是用了兩顆玻璃珠,而這裡是m顆玻璃珠; 不過,同樣是扔珠子,所以思路都是一樣,只不過變得更有普

2019遊戲暑期實習生招聘試題(20184月27日)第一題解答

題目描述:足球比賽的積分排名,一共16支球隊,分為4組,每組4支球隊,小組賽實行單迴圈制,每組一共進行6場比賽,勝者積3分,負者0分,打成平局各得一分,積分相同看淨勝球數,淨勝球多的排名靠前,淨勝球數相同看總進球數,總進球數多的排名靠前,總進球數也相同的球隊,名稱的字母序小的

2016騰訊試題(研發崗)

最近網際網路筆試較頻繁,也跟著師兄一起做了一些公司的筆試題,先將題記錄下來吧,答案慢慢補。希望對自己明年找工作有幫助!首先上騰訊的筆試題,騰訊是我的dream offer啊啊啊啊啊啊啊! 一、不定

2017-08-25阿里試題---菜鳥倉庫

”’ 阿里巴巴校招筆試附加題2菜鳥倉庫貨架編號問題 題目複述: 倉庫編號為0-9整數 以下為一示例: 1| 12| 123| 1234| 12345| ……|1234567891011

今日頭條2017試題

問題描述: 頭條的2017校招開始了!為了這次校招,我們組織了一個規模巨集大的出題團隊,每個出題人都出了一些有趣的題目,而我們現在想把這些題目組合成若干場考試出來,在選題之前,我們對題目進行了盲審,並定出了每道題的難度系統。一場考試包含3道開放性題目,假設他們

2017試題

題目:輸入一個字串從左到右遍歷,如果遇到三個連續相同的子串就將這個子串刪除,並將原串剩下的部分拼接到一起,重複上述過程,直到字串中沒有可以刪除的子串。 eg: 輸入:AAABCCDDDCB AABBBABBBA 輸出:BB

2014新浪試題:取水果(17第一篇讓人懵逼的面試題)

前言 2017 年,我還是會堅持每週一篇面試題,當然我每週看的面試題肯定是不止一篇的,我是在這周看過的面試題中,選擇一題自己認為較好的來寫。因為每一篇都寫,不現實,寫一篇部落格,需要的時間也是挺長的,所以選擇較好較大眾化的題目。 一、題目

試題編程技巧總結

hid sca 筆試 result div else 總結 class ash 技巧一://統計字符串s1的頻率 String s1 = in.nextLine(); //統計字符串s1的頻率 for (char c1 : s1.toCharAr

1~n的全排列--閱文集團2018試題

put ron class 校招 next() tostring return bsp 輸出格式 題目大意:給定整數n,求出1~n的全排列 示例 輸入:n=3 輸出:[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1] 1 im

2018 CVTE 前端試題整理

簡單的 三欄布局 位置 back 左右 blue color for循環 結果 昨天晚上(7.20)做了CVTE的前端筆試,總共三十道題,28道多選題,2道編程題 。做完了之後覺得自己基礎還是不夠紮實,故在此整理出答案,讓自己能從中得到收獲,同時給日後的同學一些參考。 首先

瓜子18試題 單詞逆序

對於一個字串,設計一個演算法,只在字串的單詞間做逆序調整,也就是說,字串有一些空格分隔符的部分組成,你需要將這些部分逆序。 給定一個原字串A,請返回逆序後的字串。 例,輸入:I am a boy!。輸出: boy! a am I 輸入描述:輸入一行字串str。(1<=strlen(st