- 计数质数
配上下图,一下就清晰了,图片来自他处
int countPrimes(int n){
int* lable=(int *)malloc(sizeof(int)*n);//拉不了[i]为1则为非素数
memset(lable,0,sizeof(int)*n);
long i,j,count=0;
for(i=2;i<n;i++){
if(lable[i])
continue;
count++;
for(j=i*i;j<n;j+=i){
lable[j]=1;
}
}
free(lable);
return count++;
}
另外,最大公约数,最小公倍数这种也要懂的哈
- 阶乘后的零
注释中解释了n为25的时候的情况
int trailingZeroes(int n){//尾部的 0 由 2 * 5 得来,2 的数量明显多于 5 的数量,因此只要统计有多少个 5 即可
return n == 0 ? 0 : n / 5 + trailingZeroes(n / 5);//25为5的平方,可提供两个5。也是5的5倍,{20,15,10,5}一共提供四个
}
- 有效的完全平方数
因为不能用sqrt(),所以for循环的条件很难整呀,这样运行出来700多ms,时间复杂度不太行呐
bool isPerfectSquare(int num){
long temp,i;
if(num==1)
return true;
for(i=1;i<=num/2;i++)
{
temp=i*i;
if(temp==num)
return true;
}
return false;
}
平方序列:1,4,9,16,…
间隔:3,5,7,…
间隔为等差数列,使用这个特性可以得到从 1 开始的平方序列。
bool isPerfectSquare(int num){
int subNum = 1;//平方数等于k个奇数的和
while (num > 0) {
num -= subNum;
subNum += 2;
}
return num == 0;
}