⭐️前面的话⭐️
本篇文章介绍来自牛客试题广场的两道题题解,分别为【二进制插入】和【查找组成一个偶数最接近的两个素数】,展示语言java。
📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2022年7月23日🌴
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《算法导论》,📚《算法》
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
给定两个32位整数n和m,同时给定i和j,将m的二进制数位插入到n的二进制的第j到第i位,保证n的第j到第i位均为零,且m的二进制位数小于等于i-j+1,其中二进制的位数从0开始由低到高。
测试样例:
1024,19,2,6
返回:1100
题目链接:二进制插入
基本思路: 位运算
解题思路:
需要将数字m
的二进制数位插入到n
的第j
位到第i
位,并且已知n
的第j
位到第i
位都为0
,并且m
的有效二进制位数小于等于i-j+1
,其中二进制的位数从0开始由低到高。
我们可以先让m
左移j
位,然后再与n
按位或运算,就能实现插入操作了。
import java.util.*;
public class BinInsert {
public int binInsert(int n, int m, int j, int i) {
// write code here
m <<= j;
return n | m;
}
}
本题为位运算运用题,只要读懂题,问题不大。
任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对。
数据范围:输入的数据满足 4≤n≤1000
输入描述:
输入一个大于2的偶数
输出描述:
从小到大输出两个素数
示例1
输入:
20
输出:
7
13
示例2
输入:
4
输出:
2
2
题目链接:查找组成一个偶数最接近的两个素数
基本思路: 判断素数+数学
解题思路:
题目会给我们一个大于2
的偶数,并且告诉我们偶数可以拆分成两个素数,让我们输出差值最小的素数对。
那肯定的先有一个判断素数的方法,素数就是大于1
和只能被本身和1
整除的整数,最简单的判断素数的方式是枚举从2
到根号n
的数,如果n
能够整除任意一个数,就不是素数,否则就是一个素数。
我们可以先将这个n
除以2
得到half
,然后以half
为中心,向两端逐个枚举,不妨记左端的数为left
,右端的数为right
,如果枚举的两个数都是素数那么就是一个素数对,由于素数大于1
,因此left>1 right
0
,由于我们从中心点开始向两端枚举,所以最早发现的素数对就是差值最小的素数对。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
//将偶数除以2,得到的一定是一个整数,从这个整数向两周扩散,判断这两个数是否是素数,如果都是素数,则就是答案
int half = n / 2;
int left = half;
int right = half;
while (left > 1 && right < n - 1) {
if (isPrime(left) && isPrime(right)) {
System.out.println(left);
System.out.println(right);
break;
}
left--;
right++;
}
}
//判断是否是素数
private static boolean isPrime(int n) {
if (n <= 1) return false;
for (int i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
}
本题为简单数学运用题,如果你知道怎么判断素数,这道题其实很简单。