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

前言

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

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

目录

LeetCode 1492. n的第k个因子

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

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

分析

题目中说到,考虑整数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;
}

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

LeetCode 1362. 最接近的因数

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

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

分析

根据题意,首先要枚举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讲:因子分解和枚举(部分)

       谢谢大家观看~~
上一篇:蓝桥杯2014年第五届真题——拼接平方数(C/C++)


下一篇:python参数估计(一个总体比例)