数学基本算法
创始人
2024-05-11 15:13:14

欧几里得算法

求两个数的最大公约数:

/**** @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。

相关内容

热门资讯

猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...