原文章出处专栏为: 算法零基础100讲
若你也想学好算法与数据结构,请跟着他的脚步: 英雄哪里出来
原题链接: 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; }
原题链接: 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; }
由于我的理解能力和数学不太好,做到这一步也算可以。
谢谢大家观看~~