1. 程式人生 > >京東2017校招編程題

京東2017校招編程題

兩個 convert 二進制表示 div 連通 負責 希望 nal cin

京東2017校招編程題

1.進制均值

盡管是一個CS專業的學生,小B的數學基礎很好並對數值計算有著特別的興趣,喜歡用計算機程序來解決數學問題,現在,她正在玩一個數值變換的遊戲。她發現計算機中經常用不同的進制表示一個數,如十進制數123表達為16進制時只包含兩位數7、11(B),用八進制表示為三位數1、7、3,按不同進制表達時,各個位數的和也不同,如上述例子中十六進制和八進制中各位數的和分別是18和11,。 小B感興趣的是,一個數A如果按2到A-1進制表達時,各個位數之和的均值是多少?她希望你能幫她解決這個問題? 所有的計算均基於十進制進行,結果也用十進制表示為不可約簡的分數形式。
 1
#include<iostream> 2 #include<vector> 3 #include<string> 4 #include<algorithm> 5 using namespace std; 6 int change(int n, int m) 7 { 8 int i = 0; 9 int sum = 0; 10 while(1) 11 { 12 sum += n % m; 13 n /= m; 14 if(n == 0) 15 break
; 16 } 17 return sum; 18 } 19 //計算sum和n-2的最大公約數,方便輸出進行約分 20 int gdb(int a, int b) 21 { 22 if(a < b) 23 swap(a, b); 24 if(a % b == 0) 25 return b; 26 else 27 return gdb(b, a%b); 28 } 29 30 int main() 31 { 32 int n; 33 while(cin>>n) 34 { 35 int
sum = 0; 36 for(int i=2; i<n; i++) 37 sum += change(n, i); 38 int b = gdb(sum, (n-2)); 39 cout << sum/b << "/" << (n-2)/b << endl; 40 //cout<<sum<<"/"<<n-2<<endl; 41 } 42 return 0; 43 }

2.幸運數

小明同學學習了不同的進制之後,拿起了一些數字做起了遊戲。小明同學知道,在日常生活中我們最常用的是十進制數,而在計算機中,二進制數也很常用。現在對於一個數字x,小明同學定義出了兩個函數f(x)和g(x)。 f(x)表示把x這個數用十進制寫出後各個數位上的數字之和。如f(123)=1+2+3=6。 g(x)表示把x這個數用二進制寫出後各個數位上的數字之和。如123的二進制表示為1111011,那麽,g(123)=1+1+1+1+0+1+1=6。 小明同學發現對於一些正整數x滿足f(x)=g(x),他把這種數稱為幸運數,現在他想知道,小於等於n的幸運數有多少個?
 1 #include<iostream>
 2 using namespace std;
 3 int f(int n,int m)
 4 {
 5     int i = 0;
 6     int sum = 0;
 7     while(1)
 8     {
 9         sum += n % m;
10         n /= m;
11         if(n == 0)
12             break;
13     }
14     return sum;
15 }
16 int main()
17 {
18     int n;
19     int count=0;
20     while(cin>>n)
21     {
22         for(int i=1;i<=n;i++)
23         {
24             int a=f(i,10);
25             int b=f(i,2);
26             if(a==b)
27                 count++;
28         }
29         cout<<count<<endl;
30     }
31     return 0;
32 }

3.集合合並

給你兩個集合,要求{A} + {B}。 註:同一個集合中不會有兩個相同的元素。
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <vector>
 4 using namespace std;
 5 int main()
 6 {
 7     vector<int> v;
 8     int n,m,i;
 9     int temp;
10     while(cin>>n>>m)
11     {
12         v.clear();
13         for(i=1;i<=m+n;i++)//輸入
14         {
15             cin>>temp;
16             v.push_back(temp);
17         }
18         sort(v.begin(),v.end());//排序
19         v.erase(unique(v.begin(), v.end()), v.end());//去重
20         for (i = 0; i < v.size()-1; i++)//輸出
21         {
22             cout<<v[i]<<" ";
23         }
24         cout<<v[i]<<endl;
25     }
26     //unique()函數將重復的元素放到vector的尾部 然後返回指向第一個重復元素的叠代器 再用erase函數擦除從這個元素到最後元素的所有的元素
27     return 0;
28 }

4.保衛方案

戰爭遊戲的至關重要環節就要到來了,這次的結果將決定王國的生死存亡,小B負責首都的防衛工作。首都位於一個四面環山的盆地中,周圍的n個小山構成一個環,作為預警措施,小B計劃在每個小山上設置一個觀察哨,日夜不停的瞭望周圍發生的情況。 一旦發生外地入侵事件,山頂上的崗哨將點燃烽煙,若兩個崗哨所在的山峰之間沒有更高的山峰遮擋且兩者之間有相連通路,則崗哨可以觀察到另一個山峰上的烽煙是否點燃。由於小山處於環上,任意兩個小山之間存在兩個不同的連接通路。滿足上述不遮擋的條件下,一座山峰上崗哨點燃的烽煙至少可以通過一條通路被另一端觀察到。對於任意相鄰的崗哨,一端的崗哨一定可以發現一端點燃的烽煙。 小B設計的這種保衛方案的一個重要特性是能夠觀測到對方烽煙的崗哨對的數量,她希望你能夠幫她解決這個問題。 輸入描述: 輸入中有多組測試數據,每一組測試數據的第一行為一個整數n(3<=n<=10^6),為首都周圍的小山數量,第二行為n個整數,依次表示為小山的高度h(1<=h<=10^9). 輸出描述: 對每組測試數據,在單獨的一行中輸出能相互觀察到的崗哨的對數。 示例1 輸入 5 1 2 4 5 3 輸出 7

京東2017校招編程題