京东校招笔试(C++方向)编程题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了京东校招笔试(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;
}

 

结果截图:

技术分享

 

以上是关于京东校招笔试(C++方向)编程题的主要内容,如果未能解决你的问题,请参考以下文章

Bilibili校招C++后端开发笔试 | 编程部分

牛客2021第三次校招模拟笔试(编程题部分)

校招C++笔试ACM模式输入处理

校招C++笔试ACM模式输入处理

百度 | 2021校招C++研发工程师笔试详解

2017年校招全国统一模拟笔试(第二场)编程题集合-牛客网