每日一题 | day12( 二进制插入 | 查找组成一个偶数最接近的两个素数)
Posted WhiteShirtI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题 | day12( 二进制插入 | 查找组成一个偶数最接近的两个素数)相关的知识,希望对你有一定的参考价值。
选择题
1、以下不能正确定义二维数组的选项是______。
A int a[2][2]={{1},{2}};
B int a[][2]={1,2,3,4};
C int a[2][2]={{1},2,3};
D int a[2][]={{1,2},{3,4}};
正确答案 D:无论如何,定义二维数组必须给出列的具体个数
2、代码生成阶段的主要任务是:
A 把高级语言翻译成机器语言
B 把高级语言翻译成汇编语言
C 把中间代码变换成依赖具体机器的目标代码
D 把汇编语言翻译成机器语言
正确答案 C:代码生成的四个阶段:预处理、编译、汇编、链接
3、下面程序的输出结果是__________。
#include < iostream.h>
#define SQR(A) A*A
void main() {
int x=6,y=3,z=2;
x/=SQR(y+z)/SQR(y+z);
cout< < x< < endl;
}
A 5
B 6
C 1
D 0
正确答案 D:由于宏定义没加上括号问题,最终x/=SQR(y+z)/SQR(y+z);会被解释成x/=y+z* y+z/y+z* y+z。也就是等式左边计算结果为17,6/17就等于0
4、在一个64位的操作系统中定义如下结构体:
struct st_task
{
uint16_t id;
uint32_t value;
uint64_t timestamp;
};
同时定义fool函数如下:
void fool()
{
st_task task = {};
uint64_t a = 0x00010001;
memcpy(&task, &a, sizeof(uint64_t));
printf("%11u,%11u,%11u", task.id, task.value, task.timestamp);
}
上述fool()程序的执行结果为()
A 1,0,0
B 1,1,0
C 0,1,1
D 0,0,1
正确答案 A:如下图
5、如果有一个类是 myClass , 关于下面代码正确描述的是:
myClass::~myClass(){
delete this;
this = NULL;
}
A 正确,我们避免了内存泄漏
B 它会导致栈溢出
C 无法编译通过
D 这是不正确的,它没有释放任何成员变量
正确答案 C:在类A的析构函数中,delete一个类A的对象,就会造成死循环,堆栈溢出。但是因为this是Myclass * const this指针,也就是说this指针指向的对象(不是指向的对象的值)不可以改变,所以给this赋值在编译期间就不会通过
6、函数func的定义如下:
void func(const int& v1, const int& v2)
{
std::cout << v1 << ' ';
std::cout << v2 << ' ';
}
以下代码在vs中输出结果为____。
int main (int argc, char* argv[])
{
int i=0;
func(++i,i++);
return 0;
}
A 0 1
B 1 2
C 2 1
D 2 0
E 程序强制终止并报错
F 结果与编译器有关
正确答案 D:由于未定义行为,这道题其实是有问题的,核心问题就是求职顺序的不确定性。而不同的编译器可以有不同的编译顺序!如果是从左往右的顺序,v2=0,v1=2。如果是从右往左的顺序,v1=1,v2=1
编程题
题目1:
解题代码思路:
假设n为1024,化为2进制就是10000000000
m为19,化为2进制就是10011
在n的第2个位置插入m的前6位
插入之前10000000000
插入之后100010011
00
我们可以转化为m向左移动2位后在和n合并,合并就是两数进行或操作(不存在进位,而是覆盖式)或者是两数相加,因为题目已经说明j到i位均为0,不存在进位的问题
代码:
class BinInsert {
public:
int binInsert(int n, int m, int j, int i) {
m = m << j;
return m | n;
}
};
题目2:
解题及代码思路:
1、先将小于输入的数字n的所有素数保存在一个vector数组中(有序)
2、再分别从数组的头和尾分别进行遍历,头指针left,尾指针right
3、再定义两个变量用于保存结果res1和res2
4、只要left<=right,就进入while循环,在while循环里,先将left和right位置上的两个数相加并保存在sum中,下面就开始对sum进行判断,如果sum等于我们输入的数字n,则将这两个位置上的数保存在res1和res2中,两个指针都向前移动;如果sum大于我们输入的数字n,则表示我们当前相加结果过大,需要减少,则表示right指针需要向前移动;相反则表示left需要向前移动。最后res1和res2中保存的就是最小的两个素数并且和为n的数字
代码:
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
bool isPrime(int n)
{
for (int i = 2; i <= sqrt(n); ++i)
if (n % i == 0)return false;
return true;
}
int main()
{
int n;
while (cin >> n)
{
vector<int> arr;
for (int i = 2; i < n; ++i)
{
if (isPrime(i))
arr.push_back(i);
}
int left = 0;
int right = arr.size() - 1;
int res1 = 0;
int res2 = 0;
while (left <= right)
{
int sum = arr[left] + arr[right];
if (sum == n)
{
res1 = arr[left];
res2 = arr[right];
--right;
++left;
}else if (sum > n)
--right;
else
++left;
}
cout << res1 << endl;
cout << res2 << endl;
}
return 0;
}
以上是关于每日一题 | day12( 二进制插入 | 查找组成一个偶数最接近的两个素数)的主要内容,如果未能解决你的问题,请参考以下文章