文章目录
素数
package 数论;
public class _素数 {
public static void main(String[] args) {
System.out.println(isPrime(11));
}
public 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;
}
public static boolean isPrime2(int n){
if (n==1) return false;
if (n==2||n==3) return true;
// n如果不是6的倍数两边的(数),肯定不是素数
if ((n-1) % 6 != 0 && (n+1) % 6 != 0){
return false;
}
// n如果是6的倍数两边数的(倍数),肯定不是素数
for (int i = 5; i <= Math.sqrt(n); i+=6) {
if (n%i==0 || n%(i+2)==0){
return false;
}
}
return true;
}
}
素数筛
package 数论;
public class _素数筛 {
static int[] isprime = new int[10001];
public static void main(String[] args) {
isPrime(1000);
System.out.println(isprime[3]);
}
public static void isPrime(int n){
// 1代表是素数,0代表不是素数
for (int i = 1; i <= n; i++) {
isprime[i] = 1;
}
isprime[1] = 0;
for (int i = 2; i * i <= n; i++) {
// 当前数不是素数是,其去除倍数的过程已经包含在其因数去除倍数的过程中了。
if (isprime[i]==1){ // 去掉i的倍数(肯定不是素数)
for (int j = i * i; j <= n; j+=i) {
isprime[j] = 0;
}
}
}
}
}
回文素数
package 数论;
import java.util.Scanner;
public class _回文素数 {
// static int m = 2 * (int)Math.pow(10,8);
//
// static boolean[] isprime = new boolean[m+1];
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
System.out.println(primePalindrome(n));
}
public static int primePalindrome(int N) {
for (int i = N; ; i++) {
if (i>=10000000&&i<100000000){
i = 100000000;
}
if (isHuiWen(i)&&isPrime(i)){
return i;
}
}
}
public static boolean isHuiWen(int x){
char[] chs = (x+"").toCharArray();
for (int i = 0,j=chs.length-1; i <= j; i++,j--) {
if (chs[i]!=chs[j]){
return false;
}
}
return true;
}
public static boolean isPrime(int x){
if (x==1) return false;
for (int i = 2; i <= Math.sqrt(x); i++) {
if (x%i==0){
return false;
}
}
return true;
}
public static boolean isPrime2(int n){
if (n==1) return false;
if (n==2||n==3) return true;
// n如果不是6的倍数两边的(数),肯定不是素数
if ((n-1) % 6 != 0 && (n+1) % 6 != 0){
return false;
}
// n如果不是6的倍数两边数的(倍数),肯定不是素数
for (int i = 5; i <= Math.sqrt(n); i+=6) {
if (n%i==0 || n%(i+2)==0){
return false;
}
}
return true;
}
// public static void isPrime(){
//
// for (int i = 2; i <= m; i++) {
// isprime[i] = true;
// }
//
// for (int i = 2; i * i <= m; i++) {
// if (isprime[i]){
// for (int j = i*i; j <= m; j+=i) {
// isprime[j] = false;
// }
// }
// }
// }
}
大数运算
package 数论;
import java.math.BigDecimal;
import java.math.BigInteger;
public class _大数运算 {
public static void main(String[] args) {
BigInteger a1 = BigInteger.valueOf(3);
BigInteger a2 = BigInteger.valueOf(3);
BigDecimal a3 = BigDecimal.valueOf(5.0);
BigDecimal a4 = BigDecimal.valueOf(5.0);
a1.add(a2);
a1.subtract(a2);
a1.multiply(a2);
a1.divide(a2);
a1.mod(a2);
a1.pow(3);
a1.isProbablePrime(1);
a1.toString().substring(3);
// 取小数点后100位,四舍五入
a3.divide(a4,100,BigDecimal.ROUND_HALF_UP).doubleValue();
a3.divide(a4);
}
}
最大公约数/最小公倍数
package 数论;
public class _最大公约数_最小公倍数 {
public static void main(String[] args) {
System.out.println(fact(75, 125));
System.out.println(mulitple(75, 125));
}
public static int fact(int a, int b){
return b==0? a: fact(b, a%b);
}
public static int mulitple(int a,int b){
return a * b / fact(a,b);
}
}
快速幂
package 数论;
import java.util.Arrays;
public class _快速幂 {
public static void main(String[] args) {
// 整数的快速幂
System.out.println(fn(10,11));
// 利用快速幂的方式求斐波那契额数列的前n项
int n = 10;
long[][] x = {{1, 1}, {1, 0}};
long[][] y = {{1, 1}, {0, 0}};
// x^n-2 * y ==> [0][0]为第n个斐波那契数
x = fn2(x,n-2);
x = multi(y, x);
System.out.println(Arrays.toString(x[0]));
System.out.println(Arrays.toString(x[1]));
}
// 指数快速幂
public static long fn(long x, long e){
long num = 1;
while (e>0){
if ((e&1)==1){
num *= x;
}
x *= x;
e = e >> 1;
}
return num;
}
// 矩阵快速幂
public static long[][] fn2(long[][] x, long e){
// 单位矩阵
long num[][] = {{1,0},{0,1}};
while (e>0){
if ((e&1)==1){
num = multi(num, x);
}
x = multi(x,x);
e = e >> 1;
}
return num;
}
// 矩阵乘法
private static long[][] multi(long[][] x, long[][] y) {
long[][] res = new long[2][2];
res[0][0] = x[0][0]*y[0][0] + x[0][1]*y[1][0];
res[0][1] = x[0][0]*y[0][1] + x[0][1]*y[1][1];
res[1][0] = x[1][0]*y[0][0] + x[1][1]*y[1][0];
res[1][1] = x[1][0]*y[0][1] + x[1][1]*y[1][1];
return res;
}
}
求约数
package 数论;
public class _求约数 {
static int factors(long n) {
int res = 1, now;
for (int i = 2; i * i <= n; i++) {//首先找到小于根号n的所有质数,
now = 1;
while (n % i == 0) {
n /= i;
now++;
}
if (now > 1){
res *= now;
}
}
return n > 1? res * 2 : res;
}
}
模拟手除
package 数论;
import java.util.Scanner;
public class _模拟手除 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 求a/b的小数部分从第n位小数开始向后的3位小数
// 模拟手除过程
long a = scan.nextLong();
long b = scan.nextLong();
int n = scan.nextInt();
while (n>10){
a *= 1e10;
a %= b;
n -= 10;
}
while (n>1){
a *= 10;
a %= b;
n--;
}
for (int i = 0; i < 3; i++) {
a *= 10;
System.out.print(a/b);
a %= b;
}
System.out.println();
}
}