《算法零基础》第10讲:因子分解和枚举(部分)

Posted Sauron7i

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《算法零基础》第10讲:因子分解和枚举(部分)相关的知识,希望对你有一定的参考价值。

前言

原文章出处专栏为: 算法零基础100讲

若你也想学好算法与数据结构,请跟着他的脚步: 英雄哪里出来

LeetCode 1492. n的第k个因子

原题链接: 1492. n的第k个因子

分析

题目中说到,考虑整数n的所有因子,并升序排列找出第k个,其实不用想的那么麻烦。
直接采用从1开始枚举,如果枚举的数字能整除 n ,则记录一次,这样枚举本来就是升序排列找到第K个。

代码

int kthFactor(int n, int k)
{
    int count = 0, ans = -1;
    for (int i = 1; i <= n; ++i)
    {
        if (n % i == 0) //是因子记录一次
        count++;
        if (count == k) //当记录次数等于k,就找到了
        {
            ans = i;
            break;
        }
        
    }

    return ans;
}

LeetCode 1362. 最接近的因数

原题链接: 1362. 最接近的因数

分析

根据题意,首先要枚举num+1和num+2;
再从1到sqrt(num + 1),1到sqrt(num+2)枚举,因为如果在1到sqrt(num+1)之间有因子,那么在sqrt(num+1)到(num+1)之间有对应的因子。

如果是因子的话,将两个因子差的绝对值和上一次的因子作比较,如果差值更小,就将两个因子放入该返回的数组中。

代码

int* closestDivisors(int num, int* returnSize)
{
	//申请返回数组
    *returnSize = 2;
    int* ans = (int*)malloc(sizeof(int) * 2);
    if (NULL == ans) return NULL;
    
    //先将第一次的差置为最大值,为了下面的比较
    ans[0] = 0, ans[1] = INT_MAX;
	
	//枚举 num+1 和 num+2
    for (int n = num + 1; n <= num + 2; ++n)
    {
        for (int i = 1; i * i <= n; ++i)
        {
            if (n % i == 0) //如果是因子,就进来判断
            {
            	// 每次和上一次的差值作比较,更小的放入数组
                if (abs(n / i - i) < abs(ans[0] - ans[1]))
                {
                    ans[0] = n / i;
                    ans[1] = i;
                }
            }
        }
    }

    return ans;
}

由于我的理解能力和数学不太好,做到这一步也算可以。

       谢谢大家观看~~

以上是关于《算法零基础》第10讲:因子分解和枚举(部分)的主要内容,如果未能解决你的问题,请参考以下文章

《算法零基础》第9讲:算术基本定理

《算法零基础100例》(第10例) 因子分解

《算法零基础》第12讲:因子和题解

题解《算法零基础100讲》(第12讲) 因子和&&(第13讲 --- 第一题)最大公约数(java版)

《算法零基础》第18讲:线性枚举- 统计法入门

《算法零基础100讲》(第32讲) 多维枚举 - 进阶