每日一题 | 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
插入之后10001001100
我们可以转化为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( 二进制插入 | 查找组成一个偶数最接近的两个素数)的主要内容,如果未能解决你的问题,请参考以下文章

每日一题 | day19(汽水瓶 | 查找两个字符串 a,b 中的最长公共子串)

每日一题 错选择 及 编程题 周总结

算法·每日一题(详解+多解)-- day15

算法·每日一题(详解+多解)-- day15

算法·每日一题(详解+多解)-- day15

阿铭每日一题 day 10 20180120