给你一个整数 n 。如果 n 恰好有三个正除数 ,返回 true ;否则,返回 false 。
如果存在整数 k ,满足 n = k * m ,那么整数 m 就是 n 的一个 除数 。
思路:
(1)循环条件(当你i<=n时,循环时间过长,导致超时),比如,16有一个因子为 那么,它必然有另一个因子为 16/2 = 8,所以,我们只需要遍历到
i * i <= num
即可(2)当16有个因子为4时,另一个因子也为4,但是只能算一次,剩余都算2次
(3)最后计算因数的数量是否为3,并返回。
bool isThree(int n){ int i,cnt=0; for(i=1;i*i<=n;++i){ if(n%i==0){ if(i*i==n){ cnt+=1; }else{ cnt+=2; } } } return cnt==3; }
给你两个正整数 n 和 k 。
如果正整数 i 满足 n % i == 0 ,那么我们就说正整数 i 是整数 n 的因子。
考虑整数 n 的所有因子,将它们 升序排列 。请你返回第 k 个因子。如果 n 的因子数少于 k ,请你返回 -1 。
思路:
(1)如果n%i==0,说明i为n的因子,count++;
(2)如果k=count,则返回当前的因子,否则最后返回-1;
int kthFactor(int n, int k){ int i,count=0; for(i=1;i<=n;++i){ if(n%i==0){ count++; }if(k==count){ return i; } } return -1; }
给你一个整数 num,请你找出同时满足下面全部要求的两个整数:
两数乘积等于 num + 1 或 num + 2
以绝对差进行度量,两数大小最接近你可以按任意顺序返回这两个整数。
思路:
(1) 申请一个结果数组;
(2) 枚举 num+1 和 num+2;;
(3) 根据因子 i和 n/i的绝对值,取差距最小的两个值;
int* closestDivisors(int num, int* returnSize){ int i,j,b=-1; *returnSize=2; int *ret = (int*)malloc(2*sizeof(int)); for(j=num+1;j<=num+2;++j){ for(i=1;i*i<=j;i++){ if(j%i==0){ if(b==-1||abs(j/i-i)<b){ ret[0] = i; ret[1] = j/i; b=(j/i-i); } } } } return ret; }