【算法刷题日记之本手篇】二进制插入与查找组成一个偶数最接近的两个素数

⭐️前面的话⭐️

本篇文章介绍来自牛客试题广场的两道题题解,分别为【二进制插入】和【查找组成一个偶数最接近的两个素数】,展示语言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开始由低到高。

1
我们可以先让m左移j位,然后再与n按位或运算,就能实现插入操作了。
2

🔑源代码

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<n-1,我们不难发现,越靠近左右两端点的素数对,差值越大,中心点的素数对差值最小,差值为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;
    }
}

🌱总结

本题为简单数学运用题,如果你知道怎么判断素数,这道题其实很简单。


觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!

1-99

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未见花闻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值