【筆試題】京東2017秋招筆試真題

筆試題 京東2017秋招筆試真題

一、進制均值

時間限制 C/C++語言 1000MS;其餘語言 3000MSios

內存限制 C/C++語言 65536KB;其餘語言 589824KBc++

題目描述
儘管是一個CS專業的學生,小B的數學基礎很好並對數值計算有着特別的興趣,喜歡用計算機程序來解決數學問題。如今,她正在玩一個數值變換的遊戲。她發現計算機中常常用不一樣的進製表示同一個數,如十進制數123表達爲16進制時只包含兩位數七、11(B),用八進制表示時爲三位數一、七、3。按不一樣進製表達時,各個位數的和也不一樣,如上述例子中十六進制和八進制中各位數的和分別是18和11。
小B感興趣的是,一個數A若是按2到A-1進製表達時,各個位數之和的均值是多少?她但願你能幫她解決這個問題?
全部的計算均基於十進制進行,結果也用十進制表示爲不可約簡的分數形式。數組

輸入
輸入中有多組測試數據。每組測試數據爲一個整數A(1=<A=<5000)。測試

輸出
對每組測試數據,在單獨的行中以X/V的形式輸出結果。ui

樣例輸入
5
3spa

樣例輸出
7/3
2/1code

C++代碼blog

#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;
}

運行結果
排序

二、集合

時間限制 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;
}

運行結果

三、經過考試

時間限制 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;
}

運行結果

四、異或

時間限制 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;
}

運行結果

五、拍賣產品

時間限制 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");
    }  
}

運行結果

相關文章
相關標籤/搜索