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


    ⭐️前面的话⭐️

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

    题目链接:二进制插入

    💡解题思路

    基本思路: 位运算

    解题思路:
    需要将数字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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    🌱总结

    本题为位运算运用题,只要读懂题,问题不大。

    ⭐️查找组成一个偶数最接近的两个素数⭐️

    🔐题目详情

    任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对。

    数据范围:输入的数据满足 4≤n≤1000

    输入描述:

    输入一个大于2的偶数

    输出描述:

    从小到大输出两个素数

    示例1

    输入:

    20
    
    • 1

    输出:

    7
    13
    
    • 1
    • 2

    示例2

    输入:

    4
    
    • 1

    输出:

    2
    2
    
    • 1
    • 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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    🌱总结

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


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

    1-99

  • 相关阅读:
    Myeclipse配置tomcat服务器
    Java中树形菜单的实现方式(超全详解!)
    车载通信与DDS标准解读系列(1):DDS-RPC
    MYBATIS-PLUS入门使用、踩坑记录
    亿发软件:智慧门店商超系统,2023新零售POS数字运营一体化管理
    SparkSQL的Shuffle分区设定及异常数据处理API(去重、缺失值处理)
    web大作业 比赛报名页面+ 团队介绍页面 制作
    Julia元组、字典、集合
    san.js源码解读之工具(util)篇——extend函数
    【Java】传输层协议TCP
  • 原文地址:https://blog.csdn.net/m0_59139260/article/details/125934834