zoukankan      html  css  js  c++  java
  • 京东校招笔试(C++方向)编程题

      这次笔试是今年校招我参加的第一次笔试。。出了很多状况,基础知识不扎实,导致选择题耽误了太多时间,导致后面的题目没做完,编程题也没有在

    时间内写出来,基本没有面试机会了。不过我继续研究第二个编程题,在10几分钟后做了出来。

    这个题目具体已经不记得了,但是大概意思还是记得,我们把由4和7组成的数,按小大排序,例如:4 7 44 47 74 77 444 447 474 477 744 747 774 777

    他们的序号依次为1,2,3,4.....,题目的输入是每行输入一个整数,可以很大(好像是最大为10的18次方),然后你输出对应的由4和7组成的数。

    例如:

    输入  2 

           3

           14

    输出就为

         7

         44

         777

    这个题目拿到手后,感觉就是要进行移位再与的操作,因为4747和0101多么的像,但是在笔试过程中,没有分析好怎么控制,单纯的想除以2,求关于2的余数就可以

    得到结果。自然而然没有做出来,其实这是一个关于等比数列的问题,来决定这个整数对应的数到底有几位

         1   2/   3   4   5   6/   7    8    9    10    11    12    13    14/   15

         4   7/  44 47 74 77/  444 447 474 477 744 747   774   777/ 4444

         /2   /       4           /                    8                                  /    16

    我们的思路是把这个数减去它前面的等比数列之和,再减一,对应的就是0~2的n次方-1之间的数,比如 1-2 对应的就是0,1,(二进制为0,1),3-6对应的就是0-3(

    二进制为00,01,10,11),然后我们对1进行移位操作,然后与这个0~2的n次方-1之间的数做&(与操作),如果为1,则输出7.如果为0,则输出4即可

    下面是代码:

    #include<iostream>
    using namespace std;

    int main()
    {
    unsigned long long k;
    while (cin >> k)
    {
    unsigned long long sum = 0, num = 1;
    unsigned int len = 1;
    for (;;++len)
    {
    sum += num * 2;
    num *= 2;
    if (k <= sum)break;
    }
    sum -= num;
    k = k - sum - 1;
    for (unsigned int i = len;i >= 1;--i)
    {
    if (k&(unsigned long long)(1 << (i - 1)))cout << 7;
    else cout << 4;
    }
    cout << endl;

    }
    return 0;
    }

    结果截图:

  • 相关阅读:
    python路径拼接os.path.join()函数的用法
    selenium常用定位方式
    谷歌浏览器发生个人资料错误
    【回顾】html属性、标题、段落、文本格式化
    【回顾】html简介、基础、元素
    类的定义与使用
    简单的超市库存管理系统
    方法定义练习
    参数传递
    方法的重载
  • 原文地址:https://www.cnblogs.com/csudanli/p/5843938.html
Copyright © 2011-2022 走看看