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

本文通过分析LeetCode中的两道题目——1492.n的第k个因子和1362.最接近的因数,探讨如何运用简单的数学方法解决问题。作者强调在面对复杂问题时,有时候最直接的暴力求解法反而是最佳策略。文章提供了详细的解题思路和代码实现,提醒读者不要过度优化,保持思维的简洁性。
摘要由CSDN通过智能技术生成

文章目录

零、写在前面

一、主要知识点

 课后习题详解

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;  //找不到相应的位置
}

总结

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


 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;
}

总结

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

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

XingleiGao

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

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

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

打赏作者

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

抵扣说明:

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

余额充值