数学

  1. 计数质数
    配上下图,一下就清晰了,图片来自他处
    在这里插入图片描述
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++;
}

另外,最大公约数,最小公倍数这种也要懂的哈

  1. 阶乘后的零
    注释中解释了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}一共提供四个
}
  1. 有效的完全平方数
    因为不能用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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值