文章目录
零、写在前面
一、主要知识点
课后习题详解
1492.n的第k个因子
思路
总结
1362.最接近的因数
思路
总结
这是打卡的第十天,由于今天的第二题有一定的难度,需要我花费比较大的篇幅做题解,所以分了两个分集,基础知识在
(第10讲) 因子分解和枚举https://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;}
1492. n 的第 k 个因子https://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. 最接近的因数https://leetcode-cn.com/problems/closest-divisors/
给你一个整数 num,请你找出同时满足下面全部要求的两个整数:
你可以按任意顺序返回这两个整数。
找到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;
}
很无敌,哈哈哈哈,只要单纯一些,很多题都是很好解决的-.-。