常见计算公式
长度为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;
}

浙公网安备 33010602011771号