【笔试题】京东2017秋招笔试真题

笔试题 京东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)

输出
小明通过考试的概率,最后结果四舍五入,保留小数点后五位。

样例输入 

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:
");
    for (i = 0; i < 4; ++i){
        for (j = 0; j < 4; ++j){
            printf ("%d	", M[i][j]);
        }
        printf("
");
    }
    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:
");
    for (i = 0; i < 4; ++i){
        for (j = 0; j < 4; ++j){
            printf ("%d	", M[i][j]);
        }
        printf("
");
    }  
}

运行结果

原文地址:https://www.cnblogs.com/hgnulb/p/10602139.html