数学基本算法

news2025/2/24 20:49:25

欧几里得算法

求两个数的最大公约数:

/**
     *
     * @param a 整数
     * @param b  整数
     * @return  两个整数的最大公约数
     */
    public static int gcd(int a,int b){
        return b==0?a:gcd(b,a%b);
    }

扩展欧几里得

                   

 /**
     * 
     * @param a 
     * @param b   (a,b)两个整数
     * @param x  
     * @param y   (x,y)满足 ax+by=gcd(a,b)
     * @return  a b最大公约数 x,y满足条件
     */
    public static int extend_gcd(int a,int b,int x,int y){
        if(b==0){
            x=1;
            y=0;
            return a;
        }else {
            int r=extend_gcd(b,a%b,y,x);
            y-=x*(a/b);
            return r;
        }
        
        
    }

素数筛法

素数筛法是一种用来筛选素数的算法。最简单的素数筛法是埃氏筛法(Sieve of Eratosthenes)。该算法的基本思想是:首先将数字从小到大列出来,然后用2去筛,将2留下,其他的数都删去;再用下一个素数,也就是3筛,将3留下,其他的数都删去;接下来用下一个素数5筛,首先将5×2=10以后的数删去,再将5×3=15以后的数删去,接下来用下一个素数7筛,不断重复下去......直到筛完为止。这样得到的就是素数。

 /**
     *
     * @param n  判别素数的范围 [0-n]
     */

    public static void sieveOfEratosthenes(int n) {
        boolean prime[] = new boolean[n+1];
        Arrays.fill(prime,true);

        for(int p = 2; p*p <=n; p++) {
            if(prime[p] == true) {
                for(int i = p*p; i <= n; i += p)
                    prime[i] = false;
            }
        }

        for(int i = 2; i <= n; i++) {
            if(prime[i] == true)
                System.out.print(i + " ");
        }
    }

素数判定

    public static boolean isPrime(int n) {
        if (n <= 1) {
            return false;
        }
        if (n <= 3) {
            return true;
        }
        if (n % 2 == 0 || n % 3 == 0) {
            return false;
        }
        for (int i = 5; i * i <= n; i += 6) {
            if (n % i == 0 || n % (i + 2) == 0) {
                return false;
            }
        }
        return true;
    }

质因数分解

质因数分解是指将一个整数n分解成若干个质因数相乘的形式。例如,将整数36表示为2^2 * 3^2的形式。

N的质因数要么时N本身(素数),要么一定小于\sqrt{N}。因此可以利用小于\sqrt{N}

的数对N试除,直到不能除为止。如果剩下的数不是1,那就是N的最大质因数。

public static void primeFactors(int n) {
    while (n%2==0) {
        System.out.print(2 + " ");
        n /= 2;
    }
    for (int i = 3; i <= Math.sqrt(n); i+= 2) {
        while (n%i == 0) {
            System.out.print(i + " ");
            n /= i;
        }
    }
    if (n > 2) 
        System.out.print(n);
}

 快速幂

递归

 

public static double power(double x, int n) {
    if(n==0)
        return 1;
    double v = power(x, n/2);
    if (n % 2 == 0) {
        return v * v;
    } else {
        return v * v * x;
    }
}

循环

public static double power(double x, int n) {
        double result = 1;
        while (n > 0) {
            if (n % 2 == 1) {
                result = result * x;
            }
            x = x * x;
            n = n / 2;
        }
        return result;
    }

进制转换

使用Java语言

public class Main {
    public static void main(String[] args) {
        String a=Integer.toString(100,2);
        //将10进制100转化为2进制
        System.out.println(a);


    }


}
1100100
public class Main {
    public static void main(String[] args) {
        long a=Integer.parseInt("f1",16);
        //将16进制转化为10进制
        System.out.println(a);


    }


}
241

辗转取余

public static String decimalToAny(int decimal, int base) {
    StringBuilder result = new StringBuilder();
    while (decimal > 0) {
        int remainder = decimal % base;
        result.append(remainder);
        decimal = decimal / base;
    }
    return result.reverse().toString();
}
public class Main {
    public static void main(String[] args) {
        System.out.println(decimalToAny(100,2));//100的2进制
        System.out.println(decimalToAny(100,8));
        System.out.println(decimalToAny(100,16));
        /**
         * 如果是转换成十六进制,需要额外处理余数大于9的情况,使用0-9和A-F表示即可。
         */



    }
    public static String decimalToAny(int decimal, int base) {
        StringBuilder result = new StringBuilder();
        while (decimal > 0) {
            int remainder = decimal % base;
            result.append(remainder);
            decimal = decimal / base;
        }
        return result.reverse().toString();
    }



}

1100100
144
64

位运算

public static int add(int a, int b) {
    while (b != 0) {
        int carry = (a & b) << 1;
        a = a ^ b;
        b = carry;
    }
    return a;
}

public static int subtract(int a, int b) {
    return add(a, add(~b, 1));
}

public static int multiply(int a, int b) {
    int result = 0;
    while (b > 0) {
        if ((b & 1) != 0) {
            result = add(result, a);
        }
        a = a << 1;
        b = b >> 1;
    }
    return result;
}

public static int divide(int a, int b) {
    int sign = ((a < 0) ^ (b < 0)) ? -1 : 1;
    a = Math.abs(a);
    b = Math.abs(b);
    int quotient = 0;
    for (int i = 31; i >= 0; i--) {
        if ((a >>> i) >= b) {
            quotient += 1 << i;
            a -= b << i;
        }
    }
    return sign * quotient;
}

判断两个数是否为异号

public static boolean Alien_sign(int a,int b){
        return (a^b)<0;
    }

消除n 2进制最后一位1

public static int remove_one(int n){
        return n&(n-1);
    }

低位0变1

n|=n+1;

低位1变0

n&=n-1;

Java中支持所有基本的位运算操作,如与(&)、或(|)、异或(^)、左移(<<)、右移(>>)和无符号右移(>>>)。

int x = 5; 
int y = 6;
int result = x & y;

运算后result为4,因为二进制下5为101,6为110,取与后为100。

int x = 5; 
int y = 6;
int result = x | y;

运算后result为7,因为二进制下5为101,6为110,取或后为111。

int x = 5; 
int y = 6;
int result = x ^ y;

运算后result为3,因为二进制下5为101,6为110,取异或后为011。

int x = 5;
int result = x << 2;

运算后result为20,因为二进制下5为00000101,左移两位后为00010100。

int x = 20;
int result = x >> 2;

运算后result为5,因为二进制下20为00010100,右移两位后为00000101。

int x = -20;
int result = x >>> 2;

运算后result为1073741803,因为二进制下-20为1111111111111111111111111101100,无符号右移两位后为0011111111111111111111111101100。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/162300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeNet5模型与全连接模型的差异

1 问题深度学习训练过程中&#xff0c;有很多的训练模型&#xff0c;我们组就在思考LeNet模型与之前运用的全连接模型在训练精度损失与验证精度损失上有什么差别&#xff1f;2 方法这是LeNet模型的主要代码&#xff0c;对数据进行两成卷积与两次池化之后再建立三成全连接即可。…

Oracle数据库的监控指标

一、Oracle 监控指标 Oracle数据库常见性能指标主要有:当前登录数、非阻塞锁数、当前死锁数、阻塞锁数、当前锁数、会话数等内容,如下图所示。 注意:以下是 Oracle 监控所需要的指标,具体根据需要监控哪些、超阈值而定。 1.1 新建主机群组 1.2 新建模板 1.3 创建主机 …

Qt 6.4.2在Windows上安装过程及简单验证

Qt是一个跨平台的C开发库&#xff0c;用来开发图形用户界面(Graphical User Interface, GUI)。它支持Windows、Linux、macOS、Android、iOS、QNX等平台&#xff0c;一个框架、一套代码库、任意平台部署。Qt有开源和商业两种许可。 Qt从5.15开始官方不再直接提供开源的exe…

H5——连连看小游戏实现思路及源码

部门要求推广新产品用连连看小游戏的方式&#xff0c; 设计那边UI还没有排期&#xff0c;先撸个功能demo&#xff0c;正好记录一下&#xff1b; 连连看都玩过&#xff0c;程序的关键在于判断连续点击的两张图片是否能够消除&#xff0c;两个图片消除的条件有两个&#xff1a; …

【3 - 特征工程】菜菜sklearn机器学习

课程地址&#xff1a;《菜菜的机器学习sklearn课堂》_哔哩哔哩_bilibili 第一期&#xff1a;sklearn入门 & 决策树在sklearn中的实现第二期&#xff1a;随机森林在sklearn中的实现第三期&#xff1a;sklearn中的数据预处理和特征工程第四期&#xff1a;sklearn中的降维算法…

Blog Navigation

Blog Navigation Linux Kernel 0x01_LinuxKernel_内核的启动&#xff08;一&#xff09;之启动前准备[2022-7-5]0x02_LinuxKernel_内核的启动&#xff08;二&#xff09;SMP多核处理器启动过程分析 [TODO]0x21_LinuxKernel_内核活动&#xff08;一&#xff09;之系统调用 [20…

【OpenGL学习】OpenGL窗口创建

OpenGL窗口创建 本节介绍如何在利用配置好的GLFW和GLAD进行一个简单窗口的绘制&#xff0c;首先明白在OpenGL中进行图形绘制到窗口的整个流程&#xff1a; 初始化GLFW创建窗口window创建OpenGL上下文初始化Glad渲染循环结束绘制 初始化GLFW 然后我们从上面的流程逐步进行窗…

知微传感3D相机SDK开发文档一查找相机

知微传感3D相机SDK开发文档一查找相机 主要对知微传感3D相机的SDK文件做一个介绍&#xff0c;大家一个界面显示程序包含图像的获得&#xff0c;相机的查找和链接 查找相机&#xff0c;通过UDP广播形式查找局域网相机链接相机&#xff0c;通过IP地址链接局域网内的相机获取图片&…

如何提升计算机的运行速度-正确清理C盘的方法

本文是向大家介绍清理C盘的方法&#xff0c;它能够实现给系统盘瘦身&#xff0c;能够带来提升计算机运行速度价值。提升计算机的运行速度-清理C盘的方法1 利用Windows附带的磁盘清理工具鼠标右击【C盘】选择【属性】选择【磁盘清理】勾选需要清理的文件&#xff0c;点击【确定】…

2023 hgame --- week1 wp

文章目录Miscsign ine99p1ant_want_girlfriend神秘的海报Where am IWebClassic Childhood GameBecome A MemberGuess Who I AmShow Me Your BeautyCryptoRSABe Stream神秘的电话兔兔的车票Retest_your_IDAeasyasmencodeeasyenca_cup_of_teaPwntest_nciotHelp the uncle who can…

【阶段三】Python机器学习29篇:机器学习项目实战:DBSCAN算法的基本原理与DBCSAN新闻聚类分群模型

本篇的思维导图: DBSCAN模型 DBSCAN(全称为Density-Based Spatial Clustering of Applications with Noise)是一种以密度为基础的空间聚类算法,可以用密度的概念剔除不属于任一类别的噪声点。该算法将簇定义为密度相连的点的最大集合,将具有足够密度的区域划分为…

rabbitmq命令大全

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 文章目录服务管理启动服务后台启动查看状态用户管理新增账号删除用户所有用户:修改密码:清除密码角色管理设…

MinIO安装总结

概述 初学者安装MinIO还是会遇到很多坑的&#xff0c;这里做个总结&#xff0c;希望能够大家可以快速的搭建MinIO环境&#xff0c;可以更好的快速入门。 linux下手动安装(不推荐) cd /opt/testMinIO wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod x…

spark Shuffle

Spark Shuffle的演进及SortShuffle的基本思想 1. 演进 HashShuffle -> HashShuffle 的Consolidate机制 -> SortBasedShuffle -> Tungsten-sort Based Shuffle 2. 各种 Shuffle的介绍 2.1 HashShuffle Spark 之所以一开始就提供基于 Hash 的 Shuffle 实现机制&…

高级驾驶辅助系统(ADAS)——自适应巡航控制系统

一、定速巡航——L1级别 定速巡航系统&#xff08;CCS&#xff1a;Cruise Control&#xff09;&#xff1a;驾驶员设定目标车速&#xff08;手动加速或减速&#xff09;&#xff0c;不能根据实际路况对车辆的行驶状态进行调节或者给予必要的预警提示&#xff0c;缺乏对环境的应…

【信管8.2】建设与管理项目团队

建设与管理项目团队在经过制定人力资源管理计划之后&#xff0c;我们就有了人力资源计划文档&#xff0c;然后通过组建团队也让团队有了正式的成员&#xff0c;接下来要干什么呢&#xff1f;当然就是在项目的开发过程中不断地建设团队和管理团队了。这两个部分的内容也是我们项…

斜方向三消查找算法的原理和实现

本文首发于微信公众号&#xff1a; 小蚂蚁教你做游戏。欢迎关注领取更多学习做游戏的原创教程资料&#xff0c;每天学点儿游戏开发知识。嗨&#xff01;大家好&#xff0c;我是小蚂蚁。上篇文章中我们讲了三消查找算法的原理和实现&#xff0c;在宝石方块中&#xff0c;除了水平…

雅思经验(2)

写作技巧&#xff1a;雅思写作忌讳的就是一边倒&#xff0c;辩论的精华在于驳斥&#xff0c;能够找出对方的漏洞&#xff0c;证明对方的观点和论据是没有道理的&#xff0c;这个点很重要。考官评价&#xff1a;“it does not address all parts of the question,so it loses ma…

【JVM系列】字符串常量池

字符串常量池 概念 字符串常量池是一个大小固定的HashTable&#xff0c;默认长度是1009。java6存放在永久代&#xff0c;java7和java8存放到java堆中。 常见面试题 用双引号定义的字符串是直接存储到常量池&#xff0c;用new String创建的是存放在堆中。 String s1 "1…

BI技巧丨计算Topn品名

BOSS&#xff1a;白茶&#xff0c;问你个事&#xff0c;能不能动态的根据我们的销量&#xff0c;告诉我销量前三的商品有哪些&#xff1f;这样便于我针对商品进行调控。 白茶&#xff1a;Topn问题&#xff1f; BOSS&#xff1a;什么套不套的&#xff0c;我不懂&#xff0c;你就…