0
点赞
收藏
分享

微信扫一扫

数论相关(Java)


文章目录

  • ​​素数​​
  • ​​素数筛​​
  • ​​回文素数​​
  • ​​大数运算​​
  • ​​最大公约数/最小公倍数​​
  • ​​快速幂​​
  • ​​求约数​​
  • ​​模拟手除​​

素数

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();
}
}


举报

相关推荐

0 条评论