笔试题 京东2017秋招笔试真题
1、进制均值
时间限制 C/C++语言 1000MS;其他语言 3000MS
内存限制 C/C++语言 65536KB;其他语言 589824KB
题目描述
尽管是一个CS专业的学生,小B的数学基础很好并对数值计算有着特别的兴趣,喜欢用计算机程序来解决数学问题。现在,她正在玩一个数值变换的游戏。她发现计算机中经常用不同的进制表示同一个数,如十进制数123表达为16进制时只包含两位数7、11(B),用八进制表示时为三位数1、7、3。按不同进制表达时,各个位数的和也不同,如上述例子中十六进制和八进制中各位数的和分别是18和11。
小B感兴趣的是,一个数A如果按2到A-1进制表达时,各个位数之和的均值是多少?她希望你能帮她解决这个问题?
所有的计算均基于十进制进行,结果也用十进制表示为不可约简的分数形式。
输入
输入中有多组测试数据。每组测试数据为一个整数A(1=<A=<5000)。
输出
对每组测试数据,在单独的行中以X/V的形式输出结果。
样例输入
5
3
样例输出
7/3
2/1
C++代码
#include<bits/stdc++.h>
using namespace std;
int hexSum(int n,int a)
{
int sum = 0;
while(n)
{
sum += (n%a);
n = n/a;
}
return sum;
}
int main()
{
int A;
while(cin>>A)
{
int sum = 0;
for(int i=2; i<=A-1; i++)
{
sum += hexSum(A,i);
}
int r = __gcd(sum,A-2);
cout<<sum/r<<'/'<<(A-2)/r<<endl;
}
return 0;
}
运行结果
2、集合
时间限制 C/C++语言 1000MS;其它语言 3000MS
内存限制 C/C++语言 65536KB;其它语言 589824KB
题目描述
给你两个集合,要求 {A} + {B}。
注:同一个集合中不会有两个相同的元素。
输入
多组(不超过 5 组)数据。
每组输入数据分为三行,第一行有两个数字 n,m(0<n,m<10000),分别表示集合 A 和集合 B 的元素个数。后两行分别表示集合 A 和集合 B。每个元素为不超出 int 范围的整数,每个元素之间有一个空格隔开。
输出
针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开。
样例输入
1 2
1
2 3
1 2
1
1 2
样例输出
1 2 3
1 2
C++代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int m,n,i,j,c;
int nums[20010] = {0};
while(cin>>m>>n)
{
for(i=0; i<m+n; i++)
{
cin>>nums[i];
}
sort(nums,nums+m+n);
c = unique(nums,nums+m+n)-nums;
for(j=0; j<c; j++)
{
if(j==c-1)
{
cout<<nums[j];
}
else
{
cout<<nums[j]<<' ';
}
}
}
return 0;
}
运行结果
3、通过考试
时间限制 C/C++语言 1000MS;其它语言 3000MS
内存限制 C/C++语言 65536KB;其它语言 589824KB
题目描述
小明同学要参加一场考试,考试一共有n道题目,小明必须做对至少60%的题目才能通过考试。考试结束后,小明估算出每题做对的概率,p1,p2,…,pn。你能帮他算出他通过考试的概率吗?
输入
输入第一行一个数n(1<=n<=100),表示题目的个数。第二行n个整数,p1,p2,…,pn。表示小明有pi%的概率做对第i题。(0<=pi<=100)
输出
小明通过考试的概率,最后结果四舍五入,保留小数点后五位。
样例输入
4
50 50 50 50
样例输出
0.31250
C++代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=100+5;
int main()
{
int i,j,temp,n;
double p[maxn];
double dp[maxn][maxn];
cin>>n;
for(i=0; i<n; i++)
{
cin>>temp;
p[i] = temp/100.0;
}
dp[0][0] = 1;
for(i=1; i<=n; i++)
{
dp[i][0] = dp[i-1][0]*(1-p[i-1]);
for(j=1; j<=n; j++)
{
dp[i][j] = dp[i-1][j]*(1-p[i-1])+dp[i-1][j-1]*p[i-1];
}
}
double result = 0;
for(i = (int)(ceil(0.6*n)); i<=n; i++)
{
result += dp[n][i];
}
printf("%0.5f",result);
return 0;
}
运行结果
4、异或
时间限制 C/C++语言 2000MS;其他语言 4000MS
内存限制 C/C++语言 65536KB;其他语言 589824KB
题目描述
异或运算是常见的二进制运算,给出两个n位二进制数a,b。a异或b的运算依次考虑二进制的每一位,若这一位相同,那么这一位的异或结果就是0,不同就是1。
例如a=1100, b=0100。执行a异或b的运算,a的最高位是1,b的最高位是0,两个数字不同所以最高位异或结果是1;a和b次高位都是1,所以次高位异或为0;最后两位它们都是0,所以异或结果也都是0。那么a异或b的答案就是1000。
现在输入两个n位二进制数,输出它们异或结果的十进制答案。上述样例中异或的二进制结果为1000,转化成十进制就是8。
输入
输入有三行,第一行一个数n(1<=n<=20),接下来两行有两个n位二进制数。输入的二进制数可能有前导零。
输出
输出一个数,异或结果的十进制数值,不要输出前导零。
样例输入
4
1100
0100
样例输出
8
C++代码
#include<bits/stdc++.h>
using namespace std;
int BinaryConversionDecimal(string s,int n)
{
int dec = 0, b = 1;
for(int i=0; i<n; i++)
{
dec = dec + (s[n-i-1]-'0') * b;
b *= 2;
}
return dec;
}
int main()
{
int n;
string s;
cin>>n;
cin>>s;
int a = BinaryConversionDecimal(s,n);
cin>>s;
int b = BinaryConversionDecimal(s,n);
cout<<(a^b)<<endl;
return 0;
}
运行结果
5、拍卖产品
时间限制 C/C++语言 1000MS;其它语言 3000MS
内存限制 C/C++语言 65536KB;其它语言 589824KB
题目描述
公司最近新研发了一种产品,共生产了n件。有m个客户想购买此产品,第i个客户出价Vi元。为了确保公平,公司决定要以一个固定的价格出售产品。每一个出价不低于要价的客户将会得到产品,余下的将会被拒绝购买。请你找出能让公司利润最大化的售价。
输入
输入第一行二个整数n(1<=n<=1000),m(1<=m<=1000),分别表示产品数和客户数。
接下来第二行m个整数Vi(1<=Vi<=1000000),分别表示第i个客户的出价。
输出
输出一行一个整数,代表能够让公司利润最大化的售价。
样例输入
5 4
2 8 10 7
样例输出
7
C++代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int v[1010];
int n; // 商品数 n
int m; // 客户数 m
int i,low,temp,max=0,index;
cin>>n>>m;
for(i = 0; i<m; i++)
{
cin>>v[i];
}
// 对数组 v 进行从小到大的排序
sort(v,v+m);
low = m>n?(m-m):0;
for(i = low; i<m; i++)
{
temp = v[i]*(m-i);
if(temp>=max)
{
max = temp;
index = v[i];
}
}
cout<<index<<endl;
return 0;
}
运行结果
二进制转换为十进制
#include<iostream>
using namespace std;
int main ()
{
int num, rem, temp, dec = 0, b = 1;
cout << "Enter the binary number : ";
cin >> num;
temp = num;
while (temp > 0)
{
rem = temp % 10;
dec = dec + rem * b;
b *= 2;
temp /= 10;
}
cout << "The decimal equivalent of " << num << " is " << dec;
return 0;
}
运行结果
矩阵转置
#include<stdio.h>
#define ROW 4
#define COL 4
int M[ROW][COL] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
main(){
int i, j, t;
printf("Before transposition:\n");
for (i = 0; i < 4; ++i){
for (j = 0; j < 4; ++j){
printf ("%d\t", M[i][j]);
}
printf("\n");
}
for (i = 0; i < 4; ++i){
for(j = i;j < 4; ++j){
t = M[i][j];
M[i][j] = M[j][i];
M[j][i] = t;
}
}
printf("After transposition:\n");
for (i = 0; i < 4; ++i){
for (j = 0; j < 4; ++j){
printf ("%d\t", M[i][j]);
}
printf("\n");
}
}
运行结果