8. 因子分解和枚举

这篇博客探讨了编程中与数学相关的两个问题:一是判断一个整数是否有三个正除数,二是找出给定整数的第k个因子。通过循环优化和因子计数,我们可以有效地解决这些问题。此外,还介绍了如何找到最接近给定整数的因数对,以使它们的乘积等于给定数加1或加2。
摘要由CSDN通过智能技术生成

1952. 三除数

给你一个整数 n 。如果 n 恰好有三个正除数 ,返回 true ;否则,返回 false 。

如果存在整数 k ,满足 n = k * m ,那么整数 m 就是 n 的一个 除数 。

思路:

(1)循环条件(当你i<=n时,循环时间过长,导致超时),比如,16有一个因子为 那么,它必然有另一个因子为 16/2 = 8,所以,我们只需要遍历到 i * i <= num 即可

(2)当16有个因子为4时,另一个因子也为4,但是只能算一次,剩余都算2次

(3)最后计算因数的数量是否为3,并返回。

bool isThree(int n){
    int i,cnt=0;
    for(i=1;i*i<=n;++i){
        if(n%i==0){
            if(i*i==n){
                cnt+=1;
            }else{
                cnt+=2;
            }
        }
    }
    return cnt==3;
}

 1492. n 的第 k 个因子

给你两个正整数 n 和 k 。

如果正整数 i 满足 n % i == 0 ,那么我们就说正整数 i 是整数 n 的因子。

考虑整数 n 的所有因子,将它们 升序排列 。请你返回第 k 个因子。如果 n 的因子数少于 k ,请你返回 -1 。

思路:

(1)如果n%i==0,说明i为n的因子,count++;

(2)如果k=count,则返回当前的因子,否则最后返回-1;

int kthFactor(int n, int k){
    int i,count=0;
    for(i=1;i<=n;++i){
        if(n%i==0){
            count++;
        }if(k==count){
            return i;
          }
    }
    return -1;
}

1362. 最接近的因数

给你一个整数 num,请你找出同时满足下面全部要求的两个整数:

    两数乘积等于  num + 1 或 num + 2
    以绝对差进行度量,两数大小最接近

你可以按任意顺序返回这两个整数。

思路:

(1) 申请一个结果数组;

(2) 枚举 num+1 和 num+2;;

(3) 根据因子 i和 n/i的绝对值,取差距最小的两个值;

int* closestDivisors(int num, int* returnSize){
    int i,j,b=-1;
    *returnSize=2;
    int *ret = (int*)malloc(2*sizeof(int));
    for(j=num+1;j<=num+2;++j){
        for(i=1;i*i<=j;i++){
            if(j%i==0){
                if(b==-1||abs(j/i-i)<b){
                    ret[0] = i;
                    ret[1] = j/i;
                    b=(j/i-i);
                }
            }
        }
    }
    return ret;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一窝Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值