目录
二进制插入
链接:二进制插入_牛客题霸_牛客网 (nowcoder.com)
来源:牛客网
描述
给定两个32位整数n和m,同时给定i和j,将m的二进制数位插入到n的二进制的第j到第i位,保证n的第j到第i位均为零,且m的二进制位数小于等于i-j+1,其中二进制的位数从0开始由低到高。
测试样例:
1024,19,2,6 返回:1100
理解题意:本题考察位运算
找到输入的第i到j位然后进行插入操作
怎么做:
m:1024:100000000 00 n:19 : 10011 要把n的二进制值插入m的第j位到第i位,只需要把n先左移j位,然后再进行或运算(|)即可。
m: 10000000000
n: 00001001100
10001001100
代码
class BinInsert {
public:
int binInsert(int n, int m, int j, int i) {
// write code here
for(int k = 0; k <= i - j; k++){//i-j指的是有多少个0,要移动多少次
//让 (m << k)让m向左移动到第k个位置然后&1取到最后一位
//将m的最后一位向左移动k+j次让其与n|,从而插入
n |= ((m >> k) & 1) << (k + j);
}
return n;
}
};
还有一种更简单的方法
我们直接可以让m往进插入
让M左移j位直接|N
class BinInsert {
public:
int binInsert(int n, int m, int j, int i) {
return n | m << j;
}
};
查找组成一个偶数最接近的两个素数
链接:查找组成一个偶数最接近的两个素数_牛客题霸_牛客网 (nowcoder.com)
来源:牛客网
描述
任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对。
数据范围:输入的数据满足 4 \le n \le 1000 \4≤n≤1000
输入描述:
输入一个大于2的偶数
输出描述:
从小到大输出两个素数
示例1
输入:
20输出:
7 13
示例2
输入:
4输出:
2 2
理解题意: 输出组成指定偶数的两个素数差值最小的素数对
怎么做:
本题首先需要判断素数,素数表示除过1和本身,不能被其它数整除。通过循环遍历来判断一个数是否为素数。最近的两个素数应该从最中间的位置开始向两边查找。
直接上代码
#include <iostream>
#include <cmath>
using namespace std;
bool is_prime(int num){
//用平方根判断素数
for(int i = 2; i <= sqrt(num); i++){//判断素数,这里额i不能为01,否则会发生浮点错误
if(num % i == 0){
return false;
}
}
return true;
}
int main(){
int num;
while(cin >> num){
//从一半开始
for(int i = num / 2; i >= 0; i--){
//判断i 和 num-i是否为素数
if(is_prime(i) && is_prime(num - i)){
//打印题目要求格式
cout << i << endl << num - i << endl;
break;
}
}
}
return 0;
}