一、求某个整数的正约数个数与正约数之和
1.1求某个正整数N的正约数个数
public class Main {
public static void main(String[] args) {
System.out.println(count(360));//结果为24
}
public static long count(long number){
long count=1;
for(long i=2;i<=Math.sqrt(number);i++){
long n=0;
while (number%i==0){
number=number/i;
n++;
}
if(n>0){
count=count*(n+1);
}
}
if(number>1){
count=count*2; //处理的是1次幂的情况,因为(1+1)=2;
}
return count;
}
}
1.2求某个正整数N的正约数之和
public class Main {
public static void main(String[] args) {
System.out.println(count(360));
}
public static long count(long number) {
long sum = 1;
for (long i = 2; i <= Math.sqrt(number); i++) {
long exponent = 0;
while (number % i == 0) {
number /= i;
exponent++;
}
if (exponent > 0) {
// 正确使用等比数列求和公式计算某个质因数对应的约数和
long termSum = (long) ((Math.pow(i, exponent + 1) - 1) / (i - 1));
// 累乘不同质因数对应的约数和
sum *= termSum;
}
}
//处理指数为1的情况,因为number的1次方是number,0次方是1
if (number > 1) {
sum *= (number + 1);
}
return sum;
}
}
二、求最大公约数
//求最大公约数
public static long gcd(long a,long b) {
if(b==0) {
return a;
}
return gcd(b,a%b);
}
三、分解质因数
public static void ps(int n) {
List<Integer> list=new ArrayList<>();
for(int i=2;i<=Math.sqrt(n);i++) {
while(n%i==0) {
list.add(i); //找到一个质因数
n=n/i; //更新待分解的数
}
}
if(n>1) {
list.add(n); //如果最后余数大于1,则说明它本身也是质数
}
}
四、快速幂
import java.util.Scanner;
public class a {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
long b=scan.nextInt();
long p=scan.nextInt();
long k=scan.nextInt();
System.out.println(quickmi(b,p,k));
}
public static long quickmi(long b,long p,long k){
long res=1;
while(p>0){
if((p&1)==1){
res=res*b%k;
}
b=b*b%k;
p=p>>1;
}
return res;
}
}
五、费马小定理
乘法逆元的定义
import java.util.Scanner;
public class a {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
while (n-- > 0) {
long b=scan.nextLong();
long p=1000000007-2;
long k=1000000007;
System.out.println(quickmi(b,p,k));
}
}
public static long quickmi(long b,long p,long k){
long res=1;
while(p>0){
if((p&1)==1){
res=res*b%k;
}
b=b*b%k;
p=p>>1;
}
return res;
}
}
五,求组合数问题(注意看数据范围,不同范围不同求法)
import java.util.Scanner;
public class Main {
static long[] arr=new long[16];
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int q=scan.nextInt();
arr[0]=1;
arr[1]=1;
for(int i=2;i<16;i++) {
arr[i]=i*arr[i-1];
}
while(q-->0) {
int n=scan.nextInt();
int m=scan.nextInt();
System.out.println(jiec(n,m));
}
}
public static long jiec(int n,int m) {
long ans=arr[n]/(arr[m]*arr[n-m]);
return ans;
}
}
用快速幂加费马小定理
import java.util.Scanner;
public class Main {
static long N=1000000007;
static long[] arr;
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int a=scan.nextInt();
int b=scan.nextInt();
arr=new long[3001];
arr[0]=1;
for(int i=1;i<3001;i++){
arr[i]=arr[i-1]*i%N;
}
System.out.println(jisuan(a,b));
}
//快速幂,a的b次方
public static long quickmi(long a,long b){
long ans=1;
while(b>0){
if((b&1)==1){
ans=ans*a%N;
}
a=a*a%N;
b=b>>1;
}
return ans;
}
//计算组合数
public static long jisuan(int a,int b){
long fenmu=arr[b]*arr[a-b]%N;
//费马小定理
long sum=quickmi(fenmu,N-2);
long ans=arr[a]*sum%N;
return ans;
}
}
六、素数筛
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class a {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
boolean[] prime = new boolean[n + 1]; //标记是否为素数
for (int i = 2; i <= n; i++) {
prime[i] = true;
}
List<Integer> list = new ArrayList<>(); //存素数
for (int i = 2; i <= n; i++) {
if (prime[i]) {
list.add(i);
}
for (int j = 0; j < list.size() && i * list.get(j) <= n; j++) {
//i * list.get(j) <= n这个条件是为了防止数组越界
prime[i * list.get(j)] = false;
if (i % list.get(j) == 0) {
break;
}
}
}
System.out.println(list.size());
}
}