常见计算公式

长度为n的数组,其连续子数组的个数

计算公式为:n*(n+1)/2

含有重复元素的全排列个数

对于某个长度是n的单词,假设包含k种字符,且每种字符的计数是c1, c2, .... ck
那么其异构单词有 cnt = n! / c1! / c2!·····/ ck!

数学组合数C(m,n)

public static int C(int m, int n) {
    int a=1,b=1;
    if(n>m/2) {
        n=m-n;
    }
    for(int i=1;i<=n;i++) {
        a*=(m+1-i);
        b*=i;
    }
    return a/b;
}

数学质数相关

  • 判断质数
//时间复杂度O(sqrt(n))
public static boolean isPrime (int n) {
    if (n == 1 ||  n == 0) {
        return false;
    }
    for (int i = 2; i*i <= n; i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}
//BigInteger类中的isProbablePrime可判断是否为素数
//isProbablePrime()的参数选取3-10范围内即可
new BigInteger("9").isProbablePrime(10);
  • 范围内质数个数
//取[1,n]范围内的所有素数
public int[] getPrime(int n) {
    int[] prime=new int[n+1];  //prime[1-n]表示素数,prime[0]为计数器,统计素数个数
    boolean[] mark=new boolean[n+1];    //mark[i]=true表示i不是素数
    //0, 1 均不是素数
    mark[0] = mark[1] = true;
    for(int i=2; i<=n; i++){
        //如果没标记就加入素数集
        if(!mark[i]) {
            prime[++prime[0]] = i;
        }
        //所有已知素数与i的积均 不为素数
        for(int j=1; j<=prime[0] && prime[j]<=n/i; j++) {//n/i防溢出
            mark[i*prime[j]] = true;      //标记不是素数
            //防重复,每个数都应被它的最小质因数筛掉
            if(i%prime[j]==0){
                break;
            }
        }
    }
    return prime;
}
  • 整数n的质因数
public List<Integer> primeFactor(int n){
    List<Integer> result=new ArrayList<>();
    for(int i=2;i*i<=n;i++){
        while (n%i==0){
            result.add(i);
            n/=i;
        }
    }
    if(n>1){
        result.add(n);
    }
    return result;
}

 

posted @ 2022-11-24 13:46  是小张呀qaq  阅读(362)  评论(0)    收藏  举报