[解题报告]《算法零基础100讲》(第10讲) 因子分解和枚举(上)

文章目录

零、写在前面

一、主要知识点

 课后习题详解

1492.n的第k个因子

思路

总结

 1362.最接近的因数

思路

总结


零、写在前面

         这是打卡的第十天,由于今天的第二题有一定的难度,需要我花费比较大的篇幅做题解,所以分了两个分集,基础知识在

(第10讲) 因子分解和枚举icon-default.png?t=L9C2https://blog.csdn.net/WhereIsHeroFrom/article/details/120875323

一、主要知识点

函数因子的枚举

int max1 =sqrt(num + 1 + 1e-6) + 1;//(1)
    while(--max1)   
        if(a % max1 == 0)  break;    //(2)
if(max1*max1 == a) {ans[0] = max1;ans[1] = a /max1; return ans;}
  1. +1操作是因为while会先执行-1操作,如果用for其实不用这个1。
  2. 找到最大的因子后就返回。

二、课后习题详解

1492.n的第k个因子

1492. n 的第 k 个因子icon-default.png?t=L9C2https://leetcode-cn.com/problems/the-kth-factor-of-n/

        给你两个正整数 n 和 k 。

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

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


思路

        把所有你学过的知识点忘掉!这道题其实是一个非常简单的题,只要你够单纯,不想那么多很容一ac的。就是从1到n算是否是能整除,然后看什么时候到第k个。看代码把,没写注释是因为你们肯定看的懂-.-

int kthFactor(int n, int k){
        for(int i = 1; i <= n ; i++){
            if(n % i == 0) k--; //找到一个减一
            if(!k) return i;    //找到了所有的 返回
        }
        return -1;  //找不到相应的位置
}

总结

[解题报告]《算法零基础100讲》(第10讲) 因子分解和枚举(上)_第1张图片

        很多时候暴力是非常好解决一些问题,千万别自作聪明优化,可能会适得其反。


 1362.最接近的因数

1362. 最接近的因数icon-default.png?t=L9C2https://leetcode-cn.com/problems/closest-divisors/

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

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

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


思路

找到num+1和num+2的因数中偏差最小的,计算绝对值偏差做对比得到最终结果。

如果其中一个两个因素偏差为0就可以直接返回了,不需要做更多的计算。

int* closestDivisors(int num, int* returnSize){
    int max1 =sqrt(num + 1 + 1e-6)+1,max2 = sqrt(num + 2 + 1e-6)+1,a = num + 1, b = num + 2,i;//初始为最大的可能因数

    *returnSize = 2;
    int *ans = malloc(sizeof(int) * 2);

    while(--max1)   //向下确认因数
        if(a % max1 == 0)  break;

    if(max1*max1 == a) {ans[0] = max1;ans[1] = a /max1; return ans;}//及时返回

    while(--max2)   
        if(b % max2 == 0)  break;

    if(max2*max2 == a) {ans[0] = max2;ans[1] = a /max2; return ans;}//及时返回
    
    if((b/max2 - max2) > (a/max1 - max1)){ans[0] = max1;ans[1] = a /max1;}
    else {ans[0] = max2;ans[1] = b /max2;}
    return ans;
}

总结

[解题报告]《算法零基础100讲》(第10讲) 因子分解和枚举(上)_第2张图片

 很无敌,哈哈哈哈,只要单纯一些,很多题都是很好解决的-.-。

你可能感兴趣的:(《算法零基础100讲》解题报告,算法,数据结构)