京东2017校招编程题

京东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
 
posted @ 2017-08-23 13:17  walanwalan  阅读(904)  评论(0编辑  收藏  举报